numpy的二维数组

时间:2019-12-12 09:10:05

标签: python arrays numpy

根据条件,一个人可以使用numpy.where从两个数组中选择值:

import numpy

a = numpy.random.rand(5)
b = numpy.random.rand(5)
c = numpy.where(a > 0.5, a, b)  # okay

但是,如果数组具有更大的维数,它将不再起作用:

import numpy

a = numpy.random.rand(5, 2)
b = numpy.random.rand(5, 2)
c = numpy.where(a[:, 0] > 0.5, a, b)  # !
Traceback (most recent call last):
  File "p.py", line 10, in <module>
    c = numpy.where(a[:, 0] > 0.5, a, b)  # okay
  File "<__array_function__ internals>", line 6, in where
ValueError: operands could not be broadcast together with shapes (5,) (5,2) (5,2) 

我希望有一个(5,2)形状的numpy数组。

这是什么问题?如何解决呢?

4 个答案:

答案 0 :(得分:1)

请记住,numpy广播只能从右开始,因此(5,)形阵列可以与(2,5)形阵列一起广播,而不能与(5,2)形阵列进行广播。要使用(5,2)形状的数组进行广播,您需要保持第二维,以便形状为(5,1)(任何可以使用1进行广播的内容)

因此,在索引第二维时,您需要维护它(否则,只有一个值存在时,它会删除索引维)。您可以通过将索引放在一个元素列表中来做到这一点:

a = numpy.random.rand(5, 2)
b = numpy.random.rand(5, 2)
c = numpy.where(a[:, [0]] > 0.5, a, b) # works

答案 1 :(得分:0)

您可以使用c = numpy.where(a > 0.5, a, b)

但是,如果您只想使用a的第一列,则需要考虑输出的形状。

首先让我们看看该操作的形状

(a[:, 0] > 0.5).shape#输出(5,)

是一维的

而a和b的形状是(5,2)

这是二维的,因此您无法播放

解决方案是将遮罩操作重塑为形状(5,1)

您的代码应如下所示

a = numpy.random.rand(5, 2)
b = numpy.random.rand(5, 2)
c = numpy.where((a[:, 0] > 0.5).reshape(-1, 1), a, b)  # !

答案 2 :(得分:0)

您可以尝试:

import numpy
a = numpy.random.rand(5, 2)
b = numpy.random.rand(5, 2)
c = numpy.where(a > 0.5, a, b)

答案 3 :(得分:0)

而不是:c = np.where(a>0.5,a,b)

您可以使用:c = np.array([a,b])[a>0.5]

如果 a 和 b 具有相同的形状,则适用于多维数组。