Python 将numpy数组与单个值进行比较
我有一个numpy数组“target_tokes”,其中包含许多值。我尝试接收相同形状的numpy_数组,1。在target_tokens数组中我有一个特定值(即9或2)的位置 这项工作(针对九个人): 结果:Python 将numpy数组与单个值进行比较,python,numpy,Python,Numpy,我有一个numpy数组“target_tokes”,其中包含许多值。我尝试接收相同形状的numpy_数组,1。在target_tokens数组中我有一个特定值(即9或2)的位置 这项工作(针对九个人): 结果: [[ 0. 0. 0. 0.] [ 0. 0. 0. 0.] [ 0. 0. 1. 0.] [ 0. 0. 0. 0.] [ 0. 0. 0. 0.]... 这不起作用: group = [2, 9] i_factor
[[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 1. 0.]
[ 0. 0. 0. 0.]
[ 0. 0. 0. 0.]...
这不起作用:
group = [2, 9]
i_factor = (target_tokens in group).astype(np.float32)
结果是:
i_factor = (target_tokens in group).astype(np.float32)
ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()
为什么会这样?我怎样才能在没有大循环的情况下实现我的结果(事实上,团队比两个值都大)
Thx您可以使用
首先,让我们用一个更基本的数组
来简化您要实现的目标:
a = np.array([1, 2, 7, 3, 9, 6])
a = np.array([1, 2, 7, 3, 9, 6])
以及要检查的编号
:
g = [2, 9]
要获得表示每个元素
是否等于g
中的元素
的数组
,我们可以使用按位
或,即“|”
:
((a == g[0]) | (a == g[1])).astype(np.float32)
其中:
array([ 0., 1., 0., 0., 1., 0.], dtype=float32)
array([ 1., 0., 1., 0., 1., 0.], dtype=float32)
这也适用于更高的维度
数组
例如:
a = np.array([[1, 5, 7], [9, 3, 2], [5, 8, 9]])
其中(使用相同的g
)将给出:
array([[ 0., 0., 0.],
[ 1., 0., 1.],
[ 0., 0., 1.]], dtype=float32)
请注意,如果希望g
列表具有任何大小,您还可以实现与之相同的功能
如果希望允许g
为任意大小,则不能再使用按位
或
操作数,除非您为循环
编写了一个来执行此操作。因此,为了对循环进行转义,我们可以在数组上使用np.bitwise\u或.reduce
因此,对于原始的数组
:
a = np.array([1, 2, 7, 3, 9, 6])
a = np.array([1, 2, 7, 3, 9, 6])
但是现在使用更长的g
:
g = [1, 7, 9, 4]
我们可以使用np.bitwise\u或.reduce
:
np.bitwise_or.reduce([a == e for e in g]).astype(np.float32)
其中:
array([ 0., 1., 0., 0., 1., 0.], dtype=float32)
array([ 1., 0., 1., 0., 1., 0.], dtype=float32)
除了@JoeIddon的解决方案中描述的按位OR之外,还有几个选项
一种解决方案基于@Divakar的评论:
group = [1, 9]
a = np.array([1, 1, 2, 3, 4, 1, 9, 9, 2])
(np.asarray(group)[:,None] == a).sum(axis=0)
或者,如果需要np.float32
键入:
(np.asarray(group)[:,None] == a).sum(axis=0, dtype=np.float32)
np.sum((a == g for g in group), dtype=np.float32)
另一种方法是对组中的每个测试值使用列表理解、相等性测试,并添加解决方案:
group = [1, 9]
a = np.array([1, 1, 2, 3, 4, 1, 9, 9, 2])
np.sum(a == g for g in group)
或者,如果需要np.float32
键入:
(np.asarray(group)[:,None] == a).sum(axis=0, dtype=np.float32)
np.sum((a == g for g in group), dtype=np.float32)
在这两种情况下,答案都是:
array([1, 1, 0, 0, 0, 1, 1, 1, 0]) # or float32
与和
和或
一样,
中的不允许广播。Python语言要求
中的始终返回布尔值。此外,只有右侧操作数可以定义
中的的含义,并且您使用的是列表,而不是数组。您将在Python列表的
行为中获得
NumPy在
中的操作符对您来说是有用的,也不是有用的<列表中的code>更有意义,但仍然不是您需要的。您需要,它的行为类似于在其左操作数(而不是右操作数)上广播的
测试中的:
不确定我是否得到了它,那么:np.asarray(target_tokens)[:,None]==range(9)
?我的sol使用按位或
!很好地使用了sum
虽然+1赢得了很多,并且很喜欢它,尽管我在这里实现的是更简单的解决方案np.isin()。仍然是thx1