我有一个带有许多值的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
答案 0 :(得分:2)
bitwise operator
让我们首先使用更基本的array
来简化您要实现的目标:
a = np.array([1, 2, 7, 3, 9, 6])
和您要检查的numbers
:
g = [2, 9]
获取array
1s
和0s
来表示每个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)
与and
和or
一样,in
不允许广播。 Python语言要求in
总是返回一个布尔值。此外,只有右侧操作数可以定义in
的含义,并且您使用的是列表,而不是数组。您获得了Python列表的in
行为。
NumPy的in
运算符为pretty weird,对您没用。 in
列表更有意义,但仍然不是您需要的。您需要numpy.isin
,其行为类似于在其左操作数(但不是右侧)广播的in
测试:
numpy.isin(target_tokens, group).astype(np.float32)