我有一个大小为19的数组。我想将其大小增加到30(new_array)。
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的数组
索引
[0.05263158 0.10526316 0.15789474 0.21052632 0.26315789 0.31578947
0.36842105 0.42105263 0.47368421 0.52631579 0.57894737 0.63157895
0.68421053 0.73684211 0.78947368 0.84210526 0.89473684 0.94736842
1. ]
index30
[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. ]
要填充new_array:
如果我们考虑索引数组0.05263158 0.10526316
的前两个元素,则这两个值之间的index30数组的所有值,它们在new_array中的对应位置应用与值的位置对应的VM数组的值填充索引数组中的0.05263158
等。
我可以使用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]
答案 0 :(得分:3)
编辑:您可以使用np.piecewise
。用np.less_equal
和np.outer
来创建condlist
和np.append
的{{1}}到nan
来创建VM
的值为:
funclist
如果您愿意使用new_array = np.piecewise( x = index30,
condlist = np.less_equal.outer(indexVM, index30),
funclist = np.append(VM,np.nan))
,请使用方法pandas
进行reindex
。
'ffill'
答案 1 :(得分:1)
您可以使用布尔掩码确定旧数组中的值可以插入到新数组中的位置。这比for循环要快,方法是在索引中创建np.newaxis
,然后创建np.argwhere(mask)
以获得从旧数组到新数组的映射的相关矩阵。
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)
此代码的输出是
[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]
))
,因为它将省略最后一个条目。由于np.logical_and
中的两个参数必须具有相同的维数,因此我们需要第二条语句来操作掩码。