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

5
我希望能够快速(最好不用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建议的路线,我们需要进行一些扭曲操作,以获得类似于零起始/停止位置的位置,然后将零起始/停止位置与值开始/停止位置交错,并将数字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])

这句话的意思是否清楚,或者我需要再解释一下?

输入的形式是什么?是以元组的形式 (开始,结束,值) 吗? - jterrace
2个回答

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

这正是我一直在寻找的。谢谢!现在,有没有办法推进一步,使其成为: `array([[a,a,a,a,0,0,0,0,0,b,b,b,...], [0,0,0, c,c,0,0, d d,d,....]])`如你所想,数据以(start、stop、value)的形式传入。但实际上,它是以(start、stop、value、channel)的形式传入。逐个通道循环可能是可以接受的,但如果可以进一步推进,为什么不呢? :-) Numpy.repeat 似乎无法做到这一点。 - jeffalstott
不太确定您的意思。如果您能提供确切的示例输入和输出,并修改您的问题,那将会很有帮助。 - jterrace

0

你可以使用 numpy.r_

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

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接