Numpy:沿着移动轴执行原地操作

ut6juiuv  于 2023-06-23  发布在  其他
关注(0)|答案(2)|浏览(82)

好吧,我尽我所能在标题中描述我的问题。
我的问题如下:
我有一个numpy数组,它可能不总是具有一致的形状/维度(范围从1到3)。以数组的形状为[100]的最简单的情况为例,我可以执行以下操作(并获得所需的结果):

for i, bounds in enumerate(values):
    low, high = bounds
    arr[i] *= high - low

当数组的形状为[100,200]时,我可以执行以下操作:

for i, bounds in enumerate(values):
    low, high = bounds
    arr[i, :] *= high - low

或者如果数组的形状是[200,100],我可以改为:

for i, bounds in enumerate(values):
    low, high = bounds
    arr[:, i] *= high - low

在3d的情况下,如果数组的形状是[300,100,200],我会做:

for i, bounds in enumerate(values):
    low, high = bounds
    arr[:, i, :] *= high - low

我的问题是,我不知道如何改变i在索引中的位置,也不知道如何在遍历i对应的轴时(当arr的形状发生变化时)索引所有元素。在我的例子中,i的“位置”是基于x1m4 n1福尔斯数组形状中的位置。这是numpy可以做的事情吗?还是我被许多if语句卡住了?

wgxvkvu9

wgxvkvu91#

一种可能性是移动轴,将所需的轴(根据您的标准)放在新视图a2的第一位。然后a2[i,:,:]arr[:,i,:]相同(例如),如果正确的轴为1。另外,这样,您可以使用...表示法来替换所有的:。所以a2[i,...]

# Move axis whose size is 100 in 1st position (index 0) in a2 view
# (a2 is a view of arr. So modifying its contents change arr content).
# Note, if the 1st axis is already of size 100 this will do nothing
a2 = np.moveaxis(arr, arr.shape.index(100), 0) 

for i, (low, high) in enumerate(values):
    a2[i, ...] *= high - low
    # Note this `...` works whatever the dimension, even 1.
r1zhe5dt

r1zhe5dt2#

您可以动态创建索引。索引集是一个元组,:slice(None)
找到维度中与值的长度相同的索引。然后在循环中更新索引列表中索引列表。

indexes = [slice(None)] * arr.ndims
variable_pos = arr.shape.index(len(values))
for i, (low, high) in enumerate(values):
    indexes[variable_pos] = i
    arr[tuple(indexes)] *= high - low

相关问题