假设我有一个numpy数组:
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
我有一个相应的“vector:”
vector = np.array([1,2,3])
如何对每行data
进行减法或除法,结果为:
sub_result = [[0,0,0], [0,0,0], [0,0,0]]
div_result = [[1,1,1], [1,1,1], [1,1,1]]
长话短说:如何使用与每行对应的一维标量数组对2D数组的每一行执行操作?
答案 0 :(得分:145)
你走了。您只需将None
(或np.newaxis
)与广播结合使用:
In [6]: data - vector[:,None]
Out[6]:
array([[0, 0, 0],
[0, 0, 0],
[0, 0, 0]])
In [7]: data / vector[:,None]
Out[7]:
array([[1, 1, 1],
[1, 1, 1],
[1, 1, 1]])
答案 1 :(得分:10)
如上所述,使用None
或np.newaxes
进行切片是一种很好的方法。
另一种选择是使用转置和广播,如
(data.T - vector).T
和
(data.T / vector).T
对于更高维数组,您可能希望使用NumPy数组的swapaxes
方法或NumPy rollaxis
函数。
确实有很多方法可以做到这一点。
有关广播的更全面的解释,请参阅 http://docs.scipy.org/doc/numpy/user/basics.broadcasting.html
答案 2 :(得分:1)
JoshAdel的解决方案使用np.newaxis添加维度。另一种方法是使用reshape() to align the dimensions in preparation for broadcasting。
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data
# array([[1, 1, 1],
# [2, 2, 2],
# [3, 3, 3]])
vector
# array([1, 2, 3])
data.shape
# (3, 3)
vector.shape
# (3,)
data / vector.reshape((3,1))
# array([[1, 1, 1],
# [1, 1, 1],
# [1, 1, 1]])
执行重塑()允许维度排列广播:
data: 3 x 3
vector: 3
vector reshaped: 3 x 1
请注意data/vector
没问题,但它无法为您提供所需的答案。它将array
的每个列(而不是每个行)除以vector
的每个对应元素。如果您明确地将vector
改为1x3
而不是3x1
,那么您将得到的结果。
data / vector
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
data / vector.reshape((1,3))
# array([[1, 0, 0],
# [2, 1, 0],
# [3, 1, 1]])
答案 3 :(得分:0)
Pythonic方法是...
np.divide(data,vector)
这将进行重塑,结果也是浮点格式。 在其他答案中,结果采用四舍五入的整数格式。
#注意:数据和向量中的列数均不应匹配
答案 4 :(得分:0)
添加到stackoverflowuser2010的答案中,通常情况下您可以使用
data = np.array([[1,1,1],[2,2,2],[3,3,3]])
vector = np.array([1,2,3])
data / vector.reshape(-1,1)
这会将您的向量变成column matrix/vector
。允许您根据需要执行元素操作。至少对我来说,这是最直观的处理方法,因为(在大多数情况下)numpy只会使用相同内部内存的视图来重塑它的效率。
答案 5 :(得分:0)
关键是将大小为 (3,) 的向量重塑为 (3,1):将每行除以一个元素或 (1,3):将每列除以一个元素。由于 data.shape 与 vector.shape 不对应,NumPy 会自动将 vector 的形状扩展为 (3,3) 并按元素进行除法。
In[1]: data/vector.reshape(-1,1)
Out[1]:
array([[1., 1., 1.],
[1., 1., 1.],
[1., 1., 1.]])
In[2]: data/vector.reshape(1,-1)
Out[2]:
array([[1. , 0.5 , 0.33333333],
[2. , 1. , 0.66666667],
[3. , 1.5 , 1. ]])
类似:
x = np.arange(9).reshape(3,3)
x
array([[0, 1, 2],
[3, 4, 5],
[6, 7, 8]])
x/np.sum(x, axis=0, keepdims=True)
array([[0. , 0.08333333, 0.13333333],
[0.33333333, 0.33333333, 0.33333333],
[0.66666667, 0.58333333, 0.53333333]])
x/np.sum(x, axis=1, keepdims=True)
array([[0. , 0.33333333, 0.66666667],
[0.25 , 0.33333333, 0.41666667],
[0.28571429, 0.33333333, 0.38095238]])
print(np.sum(x, axis=0).shape)
print(np.sum(x, axis=1).shape)
print(np.sum(x, axis=0, keepdims=True).shape)
print(np.sum(x, axis=1, keepdims=True).shape)
(3,)
(3,)
(1, 3)
(3, 1)