【发布时间】:2021-07-09 12:11:35
【问题描述】:
我想做什么: 假设我有一维数组形式的数据。在拟合该数据后,(scipy.optimize.curve_fit),这将被简化为一个 skaler/0D 数组。到目前为止,一切都很好。这是最简单的部分。
问题是,数据实际上不是一维的,而是 (n+1)D。所以我将不得不在除一个之外的所有轴上迭代整个数组,取一个 1D 切片,拟合该切片并将其写入一个具有 n 维的新数组。为了简单起见,我使用 sum 函数而不是在此示例代码中拟合。
def iter_columns(array: np.ndarray, axis=-1) -> np.ndarray:
"""
Reduce nd-data to (n-1)d data. By performing the operation on one axis.
:param array: Input data
:param axis: Axis to perform reduction over
:return: Array of reduced data
"""
reduced_shape = list(array.shape)
reduced_shape.pop(axis)
print(reduced_shape)
a = np.empty(tuple(reduced_shape))
print(a)
print(array)
with np.nditer(a, flags=['multi_index'], op_flags=[['writeonly']]) as it:
for a_i in it:
# modify multi index to slice over dimension of axis, append if axis
mod = list(it.multi_index)
mod.insert(axis if axis>=0 else len(mod),slice(None))
print(mod)
a_i[...] = b[tuple(mod)].sum()
return a
b = np.arange(10).reshape(5,2)
print(iter_columns(b, axis=-1))
虽然这看起来像它应该做的那样,但它看起来并不优雅。我尝试以其他方式使用 np.nditer,但我不明白如何告诉 nditer 加载块而不仅仅是单个数组条目。我也知道有一个 ufunc.reduce 函数正好用于此目的,但我找不到有关如何构造可由它使用的函数的文档。
【问题讨论】:
标签: python numpy multidimensional-array iteration slice