首页 > 解决方案 > 一维数组和数组行的数组产生不同的结果

问题描述

我很难理解为什么 B 或 C 都不等于 A。如何从 f 中提取特定行并计算与中相同的结果A

import numpy as np

L = np.array([
    [2.66667,1.33333],
    [0.8,1.6]
    ])

f = np.array([[0.5,0.333333]])

A = L*f.T

B = L*f[0,:]
C = L*f[0,:].T

print(20*'*')
print(A)
print(20*'*')
print(B)
print(20*'*')
print(C)
print(20*'*')

输出:

********************
[[1.333335  0.666665 ]
 [0.2666664 0.5333328]]
********************
[[1.333335   0.44444289]
 [0.4        0.5333328 ]]
********************
[[1.333335   0.44444289]
 [0.4        0.5333328 ]]
********************

标签: numpy

解决方案


L = np.array([
    [2.66667,1.33333],
    [0.8,1.6]
    ])

f = np.array([[0.5,0.333333]])

L是(2,2),f是(1,2)。 f.T是 (2,1)

A = L*f.T

这将 (2,2) 与 (2,1) 一起广播,将f.T列复制到 (2,2)。

B = L*f[0,:]
C = L*f[0,:].T

f[0,:]是 (2,) 形状,1d。f[0,:].T是一样的,因为只有一个 1 轴可以切换。

这里 (2,2) 乘以 (2,) => (2,2) 乘以 (1,2),那就和 一样了L*f

在您将byA的列相乘:Lf

In [235]: L[0,:]*f[0,:]
Out[235]: array([1.333335  , 0.44444289])

B它的行L

In [236]: L[:,0]*f[0,:]
Out[236]: array([1.333335 , 0.2666664])

行和列的混合和匹配可以更清晰,L呈 (2,3) 形状。

编辑

In [34]: np.array([L[:,i]*f[0] for i in range(2)]).T
Out[34]: 
array([[1.333335 , 0.666665 ],
       [0.2666664, 0.5333328]])
In [35]: np.array([L[i,:]*f[0] for i in range(2)])
Out[35]: 
array([[1.333335  , 0.44444289],
       [0.4       , 0.5333328 ]])

我切换了 [235] 和 [236]。


推荐阅读