我有两个长度相同的trival数组,tmp_reds和tmp_blues:
npts = 4
tmp_reds = np.array(['red', 'red', 'red', 'red'])
tmp_blues = np.array(['blue', 'blue', 'blue', 'blue'])
我正在使用np.repeat创建多重性:
red_occupations = [1, 0, 1, 2]
blue_occupations = [0, 2, 0, 1]
x = np.repeat(tmp_reds, red_occupations)
y = np.repeat(tmp_blues, blue_occupations)
print(x)
['red' 'red' 'red' 'red']
print(y)
['blue' 'blue' 'blue']
我想要的是x和y的以下组合:
desired_array = np.array(['red', 'blue', 'blue', 'red', 'red', 'red', 'blue'])
因此,按以下方式定义了所需数组:
(1)应用red_occupations的第一个元素的多重性
(2)应用blue_occupations的第一个元素的多重性
(3)应用red_occupations的第二个元素的多重性
(4)应用来自blue_occupations的第二个元素的多重性
...
(2 * npts-1)应用来自red_occupations的npts元素的多重性
(2 * npts)应用来自blue_occupations的npts元素的多重性
因此,这似乎是对np.repeat常规用法的简单概括。通常,np.repeat完全执行上述操作,但是使用单个数组。有谁知道某种巧妙的方法来使用多维数组然后将其展平,或者其他类似的技巧,可以通过np.repeat来实现?
我总是可以使用简单的压缩for循环和连续列表追加而不使用numpy来创建desired_array。但是,实际问题为npts〜1e7,并且速度至关重要。
最佳答案
对于一般情况-
# Two 1D color arrays
tmp1 = np.array(['red', 'red', 'red', 'green'])
tmp2 = np.array(['white', 'black', 'blue', 'blue'])
# Multiplicity arrays
color1_occupations = [1, 0, 1, 2]
color2_occupations = [0, 2, 0, 1]
# Stack those two color arrays and two multiplicity arrays separately
tmp12 = np.column_stack((tmp1,tmp2))
color_occupations = np.column_stack((color1_occupations,color2_occupations))
# Use np.repeat to get stacked multiplicities for stacked color arrays
out = np.repeat(tmp12,color_occupations.ravel())
给我们-
In [180]: out
Out[180]:
array(['red', 'black', 'black', 'red', 'green', 'green', 'blue'],
dtype='|S5')