我希望快速(希望没有for循环)生成以下形式的Numpy数组:
array([a,a,a,a,0,0,0,0,0,b,b,b,0,0,0, c,c,0,0....])
其中a,b,c和其他值在不同点的不同范围重复.我真的在想这样的事情:
import numpy as np
a = np.zeros(100)
a[0:3,9:11,15:16] = np.array([a,b,c])
这显然是行不通的.有什么建议么?
编辑(jterrace回答了原始问题):
数据以N * M Numpy数组的形式出现.每行大多为零,偶尔散布着非零数字序列.我想用序列的最后一个值替换每个这样的序列的所有元素.我会采取任何快速的方法来做到这一点!使用where和diff几次,我们可以获得每次运行的开始和停止索引.
raw_data = array([.....][....])
starts = array([0,0,0,1,1,1,1...][3, 9, 32, 7, 22, 45, 57,....])
stops = array([0,0,0,1,1,1,1...][5, 12, 50, 10, 30, 51, 65,....])
last_values = raw_data[stops]
length_to_repeat = stops[1]-starts[1]
请注意,starts [0]和stops [0]是相同的信息(运行在哪一行上进行).在这一点上,由于我所知道的唯一途径就是jterrace的建议,因此我们需要经过一些扭曲才能获得相似的零起点/终点位置,然后将零起点/终点与值start / stops交织在一起,并将数字0与last_values数组交织.然后,我们遍历每一行,执行以下操作:
for i in range(N)
values_in_this_row = where(starts[0]==i)[0]
output[i] = numpy.repeat(last_values[values_in_this_row], length_to_repeat[values_in_this_row])
这有意义吗,还是我应该再解释一些?
解决方法:
如果您具有完全指定的值和重复计数,则可以通过以下方式进行操作:
>>> import numpy
>>> values = numpy.array([1,0,2,0,3,0])
>>> counts = numpy.array([4,5,3,3,2,2])
>>> numpy.repeat(values, counts)
array([1, 1, 1, 1, 0, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0, 3, 3, 0, 0])
标签:python,numpy
来源: https://codeday.me/bug/20191102/1990381.html