在不创建昂贵副本的情况下引用numpy arrray

4 python arrays numpy reference slice

假设我有一个函数需要NumPy ndarray有2个轴,例如行和列的数据矩阵.如果从这样的数组中切出"列",则此函数也应该起作用,因此X[:, np.newaxis]为方便起见,它应该做一些内部操作.但是,我不想为此创建新的数组对象,因为在某些情况下这可能很昂贵.

我想知道是否有一个很好的方法来做到这一点.例如,以下代码是否安全(我的意思是,全局数组是否总是像Python一样不变list)?

X1 = np.array([[1,2,3], [4,5,6], [7,8,9]])
X2 = np.array([1,4,7])

def some_func(X):
    if len(X.shape) == 1:
        X = X[:, np.newaxis]
    return X[:,0].sum()       

some_func(X2)
some_func(X1[:, 0])
some_func(X1)
Run Code Online (Sandbox Code Playgroud)

我问,因为我听说在某些情况下有时会复制NumPy数组,但是,我找不到一个很好的资源.有任何想法吗?

Dav*_*idW 5

它不应该创建副本.例如:

>>> A = np.ones((50000000,))
>>> B = A[:,np.newaxis]
>>> B.flags
  C_CONTIGUOUS : False
  F_CONTIGUOUS : False
  OWNDATA : False
  WRITEABLE : True
  ALIGNED : True
  UPDATEIFCOPY : False
Run Code Online (Sandbox Code Playgroud)

注意OWNDATA : False- 它与A共享数据.

有关更多详细信息,请查看http://docs.scipy.org/doc/numpy/reference/arrays.indexing.html.基本规则是它不会创建副本,除非您使用索引数组(例如A[[1,2,4]])或使用布尔数组(例如A[[True, False, True]])进行索引.几乎所有其他东西都返回一个没有副本的视图.