Python 重复numpy子阵

Python 重复numpy子阵,python,numpy,Python,Numpy,这是我问题的简化。我有一个numpy阵列: x = np.array([0,1,2,3]) 我有一个功能: def f(y): return y**2 我可以计算f(x) 现在假设我真的想计算重复x的f(x): x = np.array([0,1,2,3,0,1,2,3,0,1,2,3]) 有没有一种方法可以做到这一点,而不必创建x的重复版本,并且对f是透明的 在我的特殊情况下,f是一个涉及的函数,其中一个参数是x。我希望能够在重复x时计算f,而不需要实际重复它,因为它不适合内存 重写f来

这是我问题的简化。我有一个numpy阵列:

x = np.array([0,1,2,3])
我有一个功能:

def f(y): return y**2
我可以计算f(x)

现在假设我真的想计算重复x的f(x):

x = np.array([0,1,2,3,0,1,2,3,0,1,2,3])
有没有一种方法可以做到这一点,而不必创建x的重复版本,并且对f是透明的

在我的特殊情况下,f是一个涉及的函数,其中一个参数是x。我希望能够在重复x时计算f,而不需要实际重复它,因为它不适合内存

重写f来处理重复的x将是一项工作,我希望有一种聪明的方法可以将numpy数组子类化来完成这项工作

任何提示都值得欣赏。

你可以(几乎)通过大步使用一些技巧来做到这一点

然而,有一些主要的警告

import numpy as np
x = np.arange(4)
numrepeats = 3

y = np.lib.stride_tricks.as_strided(x, (numrepeats,)+x.shape, (0,)+x.strides)

print y
x[0] = 9
print y
因此,
y
现在是
x
的视图,其中每一行都是
x
。没有使用新内存,我们可以使
y
任意大

例如,我可以这样做:

import numpy as np
x = np.arange(4)
numrepeats = 1e15

y = np.lib.stride_tricks.as_strided(x, (numrepeats,)+x.shape, (0,)+x.strides)
…并且使用的内存不得超过
x
所需的32字节。(
y
将使用约8 PB的ram,否则)

然而,如果我们重新塑造y,使它只有一个维度,我们将得到一个将使用全部内存的副本。无法使用跨步和形状来描述
x
的“水平”平铺视图,因此任何小于2维的形状都将返回一个副本

此外,如果我们对
y
进行操作时会返回一个副本(例如,您的示例中的
y**2
),我们将获得一个完整副本

出于这个原因,对现有事物进行操作更有意义。(例如,
y**=2
,或相当于
x**=2
。两者将完成相同的任务。)

即使对于一般函数,也可以传入
x
并将结果放回
x

例如


y
也将更新,因为它只是
x

的一个视图。为了澄清,您是否正在寻找一种有效的数据结构来保存块形式的矩阵
(a a a)
,对于某些矩阵
a
?@katrielex是的,没错。这非常聪明。谢谢你,乔。我将重写代码以使用stride_技巧并避免您指出的警告。
def f(x):
    return x**3

x[...] = f(x)
print y