根据条件,一个人可以使用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数组。
这是什么问题?如何解决呢?
答案 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 具有相同的形状,则适用于多维数组。