在Python / Numpy中一次分配多个数组索引

时间:2011-08-16 22:04:24

标签: python numpy

我希望快速(希望没有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]

请注意,start [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])

这是否有意义,或者我应该解释一下?

2 个答案:

答案 0 :(得分:4)

如果您完全指定了值和重复计数,则可以这样做:

>>> 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])

答案 1 :(得分:0)

您可以使用numpy.r_

>>> np.r_[[a]*4,[b]*3,[c]*2]
array([1, 1, 1, 1, 2, 2, 2, 3, 3])