新的多维数组将值从数组分配给第二个数组的索引

时间:2019-10-04 17:08:14

标签: python arrays numpy multidimensional-array

虽然我觉得这不太复杂,但我仍在努力寻找相似的问题/答案。

我有两个数组。

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,并在可能的情况下尽可能避免迭代,以确保代码的简洁性和可读性。

4 个答案:

答案 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]