【问题标题】:Remove elements from 2d Numpy array based on a list [duplicate]根据列表从二维 Numpy 数组中删除元素 [重复]
【发布时间】:2020-06-02 03:43:35
【问题描述】:

提前感谢您查看我的帖子。

我有一个名为 actions 的二维 np.array,形状为 (2,x),其中包含 ints

我有另一个 1d np.array keysactions 的第一个维度相同类型的元素:actions[0]。我想从actions 中删除keys 中的所有数组元素。我尝试了diff = actions[:, not actions[0] == kids_keys],但它返回了一个 (1,2,x) 形状的 3d 数组。

我怎样才能得到一个 (2,x) diff 数组?

例如:

actions = [[121122, 211122, 221122, ... 455544, 545544][0, 0.35, 0.75, ... 1, -0.25]]
keys = [211122 221122]
# The operation I am looking for:
actions - keys = [[121122, ... 455544, 545544][0, ... 1, -0.25]] 

错误:由于某种我不知道的原因,diff 数组的维度变为 (2,1,80)!

【问题讨论】:

  • 如果您为此发布代码会很有帮助,这样人们就可以看到您在尝试解决它的过程中的位置。示例输入和预期输出也会有所帮助。
  • not actions[0] == kids_keys的形状是什么?
  • 副本已转置,但您可以转置输出或仅在正确的维度上操作。

标签: python arrays numpy multidimensional-array conditional-statements


【解决方案1】:

使用np.isin:

mask = np.isin(actions[0], keys, invert=True)
result = actions[:, mask]

【讨论】:

  • 它似乎工作得很好!我想问一下~ 是什么意思,是否有其他方法可以更快地执行此操作。
  • @AlexanderIthakis ~ 是为了反转 np.isin 的结果(所以只有那些 notkeys 被保留),但我改变了它,虽然反转是一个非常快速的操作,np.isin 接受一个 invert 参数来更有效地作为函数调用本身的一部分执行相同的操作。关于更快,如果我知道更好的方法,我会发布它:) np.isin 相当快,如果所有keys 总是唯一的,你可以通过assume_unique=True。掩码是advanced indexing,比较贵。
  • 嘿,感谢详细的回答。是的,我的钥匙是独一无二的,我一定会改变它。再次感谢
【解决方案2】:

以下将过滤出actions 中在集合keys 中有第一行条目的列:

import numpy as np
x = 10
actions = np.random.randint(5, size=(2,x))
print(actions)
keys = np.array([1,2,3])
print(keys)
filtered_actions = actions[:,~np.sum([actions[0,:] == key for key in keys], dtype=bool, axis=0)]
print(filtered_actions)

【讨论】:

  • 感谢您的回答!出于某种原因,当我在终端中尝试您的代码时,它按预期工作,但是当我在代码中使用它时,我遇到了与我的方法相同的问题。它返回一个 (2, 1, x) 维度数组,而不是 (2, x)。你能帮帮我吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-11-20
  • 2012-01-23
  • 1970-01-01
  • 2017-09-18
  • 1970-01-01
  • 2016-07-13
  • 2011-05-26
相关资源
最近更新 更多