Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/316.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 将numpy数组与单个值进行比较_Python_Numpy - Fatal编程技术网

Python 将numpy数组与单个值进行比较

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

我有一个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        = (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