【发布时间】:2019-07-12 04:53:47
【问题描述】:
我有一个 2D numpy 数组,我希望选择在给定列中具有特定值的行。这对于单个数字或多个数字来说很简单,但我不能为列表做这件事。代码如下,包含我的工作内容,以及我尝试使用列表:
matrix = np.ndarray([4, 5])
matrix[0,:] = range(1,6)
matrix[1,:] = range(6,11)
matrix[2,:] = range(11,16)
matrix[3,:] = range(16,21)
li=[9,19]
matrix2=matrix[matrix[:,3]==9] # this gives me one of the requirements.
print(matrix2)
matrix3=matrix[(matrix[:,3]==9) | (matrix[:,3]==19)] # Multiple requirements explicitly laid out works.
print(matrix3)
matrix4=matrix[matrix[:,3] in li] # multiple requirements in list form do not work.
print(matrix4)
我还研究过使用Conditional indexing with Numpy ndarray 中建议的 np.where() 命令,但这似乎对我没有帮助,当使用它代替切片时,它似乎也不会改变结果上面用过。
我得到的具体错误信息是:
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
但我不明白 a.any() 或 a.all() 命令将如何帮助我。
【问题讨论】:
-
matrix4=matrix[np.isin(matrix[:,3], li)]工作吗? -
是的,完美。我知道必须有一个简单的解决方案! @Mstaino,将其发布为答案,我会接受。
-
已发布。很高兴它奏效了。我添加了
np.isin的文档以供参考 -
当测试在需要标量布尔值(简单的 True 或 False)的上下文中生成布尔数组时,会引发歧义错误。
all/any会将数组缩减为单个值,但通常不是解决方案。这里的错误在in表达式中。您的matrix3是正确使用布尔数组的好例子。 -
isin使用in1d。在某些情况下,in1d使用您的matrix3解决方案的通用版本。