Python 重复numpy子阵
这是我问题的简化。我有一个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来
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