Python 将 2 个向量的元素乘积到矩阵中
Python product of the elements of 2 vectors into a matrix
我尝试计算 2 个不同向量的元素的乘积并将结果存储在矩阵中,但我在矩阵的每一行中获得相同的值。
这是我的代码:
r=2
a = [1,2]
b = [3,4,5]
rows, cols = (len(a),len(b))
C = [[0]*cols]*rows
print(C)
for i in range(len(a)):
for j in range(len(b)):
x=a[i]*b[j]/r
C[i][j]=x
print(C)
我得到:
C=[[3.0, 4.0, 5.0], [3.0, 4.0, 5.0]]
虽然我想获得:
C=[[1.5, 2.0, 2.5], [3.0, 4.0, 5.0]]
我不明白为什么我的矩阵的两行在 i 的每次迭代中都得到满足。
预先感谢您的回答,
马丁
问题是 C = [[0]*cols]*rows
引用内存中的同一个对象 rows
次。因此,每当您更改一行时,您都在引用所有这些行。有多种方法可以在避免此问题的同时初始化矩阵,例如:C = [[0]*cols for _ in range(rows)]
.
之前已经讨论过这个问题,例如参见here.
可能与你无关,这取决于这是否是一个练习,但实际上你会在 numpy 中使用矩阵乘法来执行这些类型的任务:
import numpy as np
a = np.array([[1,2]])
b = np.array([[3,4,5]])
a.T * b / 2
out: array([[1.5, 2. , 2.5],
[3. , 4. , 5. ]])
问题是正在创建的列表是内部相互指向的指针。对一个进行更改也会对另一个进行更改。
您需要使用复制方法或者您可以像这样用不同的方法创建列表
r = 2
a = [1, 2]
b = [3, 4, 5]
rows, cols = (len(a), len(b))
C = [[0 for y in range(cols)] for x in range(rows)]
print(C)
for i in range(rows):
for j in range(cols):
x = a[i] * b[j] / r
C[i][j] = x
print(C)
使用调试器查找这些错误既快速又容易。建议您尝试使用调试器查看每次迭代中值的变化情况
我尝试计算 2 个不同向量的元素的乘积并将结果存储在矩阵中,但我在矩阵的每一行中获得相同的值。 这是我的代码:
r=2
a = [1,2]
b = [3,4,5]
rows, cols = (len(a),len(b))
C = [[0]*cols]*rows
print(C)
for i in range(len(a)):
for j in range(len(b)):
x=a[i]*b[j]/r
C[i][j]=x
print(C)
我得到: C=[[3.0, 4.0, 5.0], [3.0, 4.0, 5.0]] 虽然我想获得: C=[[1.5, 2.0, 2.5], [3.0, 4.0, 5.0]]
我不明白为什么我的矩阵的两行在 i 的每次迭代中都得到满足。
预先感谢您的回答, 马丁
问题是 C = [[0]*cols]*rows
引用内存中的同一个对象 rows
次。因此,每当您更改一行时,您都在引用所有这些行。有多种方法可以在避免此问题的同时初始化矩阵,例如:C = [[0]*cols for _ in range(rows)]
.
之前已经讨论过这个问题,例如参见here.
可能与你无关,这取决于这是否是一个练习,但实际上你会在 numpy 中使用矩阵乘法来执行这些类型的任务:
import numpy as np
a = np.array([[1,2]])
b = np.array([[3,4,5]])
a.T * b / 2
out: array([[1.5, 2. , 2.5],
[3. , 4. , 5. ]])
问题是正在创建的列表是内部相互指向的指针。对一个进行更改也会对另一个进行更改。
您需要使用复制方法或者您可以像这样用不同的方法创建列表
r = 2
a = [1, 2]
b = [3, 4, 5]
rows, cols = (len(a), len(b))
C = [[0 for y in range(cols)] for x in range(rows)]
print(C)
for i in range(rows):
for j in range(cols):
x = a[i] * b[j] / r
C[i][j] = x
print(C)
使用调试器查找这些错误既快速又容易。建议您尝试使用调试器查看每次迭代中值的变化情况