Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/340.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/visual-studio-code/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python 在多维数组上使用numpy where,但需要控制索引_Python_Multidimensional Array - Fatal编程技术网

Python 在多维数组上使用numpy where,但需要控制索引

Python 在多维数组上使用numpy where,但需要控制索引,python,multidimensional-array,Python,Multidimensional Array,如果3D数组的元素超过某个阈值,我需要修改它们。修改基于另一个数组的相关元素。更具体地说: A_ijk = A_ijk if A_ijk < threshold value = (B_(i-1)jk + B_ijk) / 2, otherwise where提供了我需要的大部分功能,但我不知道如何在没有显式循环的情况下迭代第一个索引。下面的代码执行我想要的操作,但使用循环。有更好的办法吗?假设A和B是相同的形状 for i in xrange(A.shape[0]): A[i]

如果3D数组的元素超过某个阈值,我需要修改它们。修改基于另一个数组的相关元素。更具体地说:

A_ijk = A_ijk if A_ijk < threshold value

= (B_(i-1)jk + B_ijk) / 2, otherwise
where提供了我需要的大部分功能,但我不知道如何在没有显式循环的情况下迭代第一个索引。下面的代码执行我想要的操作,但使用循环。有更好的办法吗?假设A和B是相同的形状

for i in xrange(A.shape[0]):
    A[i] = numpy.where(A[i] <= threshold, A[i], (B[i - 1] + B[i]) / 2)

为了解决下面的问题:A的前几行保证低于阈值。这可以防止i索引循环到A的最后一个条目。

您可以使用布尔索引替换A中高于阈值的元素,从而将操作矢量化。必须小心谨慎,因为对应于B[i-1]+B[i]/2的辅助数组在第一维度上的大小比A小一个,因此我们必须明确忽略A的第一行,因为它们都低于阈值,如问题中所述:

import numpy as np

# some dummy data
A = np.random.rand(3,4,5)
B = np.random.rand(3,4,5)
threshold = 0.5
A[0,:] *= threshold # put the first dummy row below threshhold
mask = A[1:] > threshold # to be overwritten, shape (2,4,5)

replace = (B[:-1] + B[1:])/2 # to overwrite elements in A from, shape (2,4,5)

# replace corresponding elements where `mask` is True
A[1:][mask] = replace[mask]

您可以使用where直接索引到ndarray:

a   = np.random.rand(4,3,10)
b   = np.zeros(a.shape)
idx = np.where(a < .1)
print(a)
a[idx] = b[idx]
print(a)
如果需要for循环,只需将ravel转换为索引并更新即可

a   = np.random.rand(4,3,10)
b   = np.zeros(a.shape)
idx = [np.ravel_multi_index(i, a.shape) for i in zip(*np.where(a < .1))]
print(a, idx)
for i in idx:
    a.ravel()[i] = b.ravel()[i]
print(a)

这个包起来了吗?例如,如果i==0,那么B[i-1]应该引用数组的最后一行?如果A[i,…]同时引用B[i,…]和B[i-1,…],那么A和B不能具有相同的形状。我的意思是它可以,但是你确定这个循环代码做了你想要它做的事情吗?谢谢!这会奏效的。如上所述,已知A的第一行低于阈值,因此来自B矩阵的掩码值从不循环around@JimParker谢谢,我错过了那个细节,那时我已经开始写答案了。我更新了答案,在这个附加假设下,它稍微简单一些,不需要辅助数组。