【问题标题】:Slicing a numpy array to select rows with values in a list. Truth value error切片 numpy 数组以选择列表中具有值的行。真值误差
【发布时间】: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 解决方案的通用版本。

标签: python list numpy slice


【解决方案1】:

使用np.isin (docs here)

matrix4=matrix[np.isin(matrix[:,3], li)]

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-11-29
    • 1970-01-01
    • 2016-10-15
    • 1970-01-01
    • 1970-01-01
    • 2012-11-19
    • 2017-09-07
    • 1970-01-01
    相关资源
    最近更新 更多