Python 通过用上一个值填充中间的值来增加数组的大小

Python 通过用上一个值填充中间的值来增加数组的大小,python,numpy,Python,Numpy,我有一个19号的数组。我想把它的大小增加到30个新的数组 size =len(VM) index = np.linspace(1,size,size)/size index30 = np.linspace(1,30,30)/30 new_array = np.empty(shape=30) VM是一个大小为19的数组 索引 指数30 [0.03333333 0.06666667 0.1 0.13333333 0.16666667 0.2 0.23333333 0.266

我有一个19号的数组。我想把它的大小增加到30个新的数组

size =len(VM)    
index = np.linspace(1,size,size)/size
index30 = np.linspace(1,30,30)/30
new_array = np.empty(shape=30)
VM是一个大小为19的数组

索引

指数30

[0.03333333 0.06666667 0.1        0.13333333 0.16666667 0.2
 0.23333333 0.26666667 0.3        0.33333333 0.36666667 0.4
 0.43333333 0.46666667 0.5        0.53333333 0.56666667 0.6
 0.63333333 0.66666667 0.7        0.73333333 0.76666667 0.8
 0.83333333 0.86666667 0.9        0.93333333 0.96666667 1.        ]
要填充新的_数组,请执行以下操作:

如果考虑索引数组0.05263158 0.10526316的前两个元素,索引数组30的所有值都在这两个值之间,则它们在NeWix数组中的对应位置应该填充对应于索引数组中的值0.05263158的位置的VM数组的值等等。 我可以使用for循环来实现这一点,但我正在寻找更有效的方法来实现这一点

输入:

[ 1,  2,  3,  4,  5,  6,  7,  8,  9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
预期产出:

[nan,1,1,2,3,3,4,5,5,6,6,7,8,8,9,10,10,11,12,12,13,13,14,15,15,16,17,17,18,19]
编辑:您可以使用。使用np.less_equal和np.outer创建condlist,使用np.append向VM添加一个nan来创建funclist的值,例如:

如果您愿意使用pandas,可以使用“ffill”方法重新编制索引

编辑:您可以使用。使用np.less_equal和np.outer创建condlist,使用np.append向VM添加一个nan来创建funclist的值,例如:

如果您愿意使用pandas,可以使用“ffill”方法重新编制索引


可以使用布尔掩码确定将旧数组中的值插入新数组的位置。这比for循环更快,方法是在索引中使用np.newaxis创建相关矩阵,然后使用np.argwheremask获得从旧数组到新数组的映射

import numpy as np

VM = np.arange(1, 20)
size =len(VM)
index = np.linspace(1,size,size)/size
index30 = np.linspace(1,30,30)/30
new_array = np.empty(30)

mask = index30[:, np.newaxis] >= index[np.newaxis, :]
mask[:,:-1] = np.logical_and(
        mask[:,:-1],
        index30[:, np.newaxis] < index[np.newaxis, 1:]
    )

index_map = np.argwhere(mask)
new_array[index_map[:,0]] = VM[index_map[:,1]]
print(new_array)
其中第一个数字是空数组中未初始化的值

请注意,您不能通过简单的操作完全获得索引映射

index_map = np.argwhere(np.logical_and(
    index[np.newaxis, :-1] <= index30[:, np.newaxis],
    index[np.newaxis, 1:] > index30[:, np.newaxis]
))

因为它将省略最后一个条目。由于np.logical_和中的两个参数必须具有相同的维度,因此我们需要第二条语句来操作掩码。

您可以使用布尔掩码来确定旧数组中的值可以插入新数组的位置。这比for循环更快,方法是在索引中使用np.newaxis创建相关矩阵,然后使用np.argwheremask获得从旧数组到新数组的映射

import numpy as np

VM = np.arange(1, 20)
size =len(VM)
index = np.linspace(1,size,size)/size
index30 = np.linspace(1,30,30)/30
new_array = np.empty(30)

mask = index30[:, np.newaxis] >= index[np.newaxis, :]
mask[:,:-1] = np.logical_and(
        mask[:,:-1],
        index30[:, np.newaxis] < index[np.newaxis, 1:]
    )

index_map = np.argwhere(mask)
new_array[index_map[:,0]] = VM[index_map[:,1]]
print(new_array)
其中第一个数字是空数组中未初始化的值

请注意,您不能通过简单的操作完全获得索引映射

index_map = np.argwhere(np.logical_and(
    index[np.newaxis, :-1] <= index30[:, np.newaxis],
    index[np.newaxis, 1:] > index30[:, np.newaxis]
))

因为它将省略最后一个条目。由于np.logical_和中的两个参数必须具有相同的维度,我们需要第二个语句来操作掩码。

将vm更改为VM@subhashnerella更正,请参阅我的编辑,有一个numpy解决方案将vm更改为VM@subhashnerella更正了,请看我的编辑,有一个numpy解决方案
[4607182418800017408  1  1  2  3  3  4  5  5  6  6  7  8  8  9 10 10 11 12 12 13 13 14 15 15 16 17 17 18 19]
index_map = np.argwhere(np.logical_and(
    index[np.newaxis, :-1] <= index30[:, np.newaxis],
    index[np.newaxis, 1:] > index30[:, np.newaxis]
))