在Python/Numpy中一次性赋值多个数组索引

6 投票
2 回答
4427 浏览
提问于 2025-04-16 23:44

我想快速生成一个特定形式的Numpy数组,最好是不用for循环。

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

这样说清楚了吗?还是需要我再解释一下?

2 个回答

0

你可以使用 numpy.r_

>>> np.r_[[a]*4,[b]*3,[c]*2]
array([1, 1, 1, 1, 2, 2, 2, 3, 3])
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])

撰写回答