虽然我觉得这不太复杂,但我仍在努力寻找相似的问题/答案。
我有两个数组。
indices_array:[0, 1, 1, 0, 0, 1, 0]
value_array:[1, 2, 3, 4, 5, 6, 7]
我想使用第一个数组作为分配索引,第二个数组作为值创建一个新数组。这将导致一个新数组的每个索引具有两个值,但是,一个值为零,另一个为我第二个数组中的值。
使用上面的示例数组,结果应为:
[[1, 0],
[0, 2],
[0, 3],
[4, 0],
[5, 0],
[0, 6],
[7, 0]]
我可以使用np.zeros((total_len, values_per_index))
尝试以下操作时,我的直觉失败:target_array[indices_array] = value_array
我相信我理解为什么我尝试的方法失败了,但是如何真正实现这一点却使我难以理解。有一个简单的方法吗?到目前为止,Python并不是我最好的语言,而且一些小技巧有时在本质上似乎太神奇了。
编辑:我知道一个for循环可以完成此任务,但我的确是在寻求更好地理解numpy,并在可能的情况下尽可能避免迭代,以确保代码的简洁性和可读性。
答案 0 :(得分:2)
您可以这样做:
import numpy as np
indices = np.array([0, 1, 1, 0, 0, 1, 0])
values = np.array([1, 2, 3, 4, 5, 6, 7])
result = np.zeros((len(indices), 2))
result[np.arange(len(indices)), indices] = values
print(result)
输出
[[1. 0.]
[0. 2.]
[0. 3.]
[4. 0.]
[5. 0.]
[0. 6.]
[7. 0.]]
请参见numpy中的indexing。
答案 1 :(得分:1)
您可以像下面那样使用乘法
indices_array = np.array([0, 1, 1, 0, 0, 1, 0])
value_array = np.array([1, 2, 3, 4, 5, 6, 7])
## you can simply do this
value_array = np.c_[value_array * (indices_array==0), value_array * (indices_array==1)]
display(value_array)
答案 2 :(得分:0)
这对您有用吗?
import numpy as np
a = np.array([0, 1, 1, 0, 0, 1, 0])
b = np.array([1, 2, 3, 4, 5, 6, 7])
print(np.array([a*b,(1-a)*b]))
[[0 2 3 0 0 6 0]
[1 0 0 4 5 0 7]]
答案 3 :(得分:0)
您可以简单地使用spawnpoints
并使用numpy广播相乘
# spawnIndex = random.randint(0,len(spawnpoints)-1)
spawnIndex = 0 # 0 rather than random
spawnpoint = spawnpoints[spawnIndex]