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

时间:2017-10-26 16:22:17

标签: python numpy

我有一个带有许多值的numpy-array“target_tokes”。我尝试接收一个相同形状的numpy_array,其中1.在target_tokens数组中我有一个特定值(即九个或两个)的位置。

这适用于(对于九个人):

i_factor        = (target_tokens == 9).astype(np.float32)

结果:

[[ 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

3 个答案:

答案 0 :(得分:2)

您可以使用bitwise operator

让我们首先使用更基本的array来简化您要实现的目标:

a = np.array([1, 2, 7, 3, 9, 6])

和您要检查的numbers

g = [2, 9]

获取array 1s0s来表示每个element是否等于elements g中的任何一个bitwise ,我们可以使用or '|' ((a == g[0]) | (a == g[1])).astype(np.float32)

array([ 0.,  1.,  0.,  0.,  1.,  0.], dtype=float32)

给出:

dimensional

这也适用于较高的arrays 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

请注意,如果您希望list g具有任何大小,您也可以使用np.bitwise_or()来实现相同的功能。< / em>的

如果您想允许bitwise为任意大小,则除非您编写or'|',否则无法再使用for-loop for-loop np.bitwise_or.reduce操作数为了逃避arrays,我们可以在array上使用a = np.array([1, 2, 7, 3, 9, 6])

原来的g

g = [1, 7, 9, 4]

但现在有更长的np.bitwise_or.reduce

np.bitwise_or.reduce([a == e for e in g]).astype(np.float32)

我们可以使用array([ 1., 0., 1., 0., 1., 0.], dtype=float32)


val OPTIONS = Map(
    "spark.hadoop.fs.s3a.experimental.fadvise" => "random"
    "spark.hadoop.orc.splits.include.file.footer" -> "true",
    "spark.hadoop.orc.cache.stripe.details.size" -> "1000",
    "spark.hadoop.orc.filterPushdown" -> "true"
    "spark.sql.parquet.mergeSchema" -> "false",
    "spark.sql.parquet.filterPushdown" -> "true"
  )

给出:

spline()

答案 1 :(得分:2)

@ 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)    

另一种方法是使用列表理解,对组中每个测试值进行相等测试,并添加解决方案:

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.sum((a == g for g in group), dtype=np.float32)

在这两种情况下,答案都是:

array([1, 1, 0, 0, 0, 1, 1, 1, 0]) # or float32

答案 2 :(得分:2)

andor一样,in不允许广播。 Python语言要求in总是返回一个布尔值。此外,只有右侧操作数可以定义in的含义,并且您使用的是列表,而不是数组。您获得了Python列表的in行为。

NumPy的in运算符为pretty weird,对您没用。 in列表更有意义,但仍然不是您需要的。您需要numpy.isin,其行为类似于在其左操作数(但不是右侧)广播的in测试:

numpy.isin(target_tokens, group).astype(np.float32)