Python Numpy:使用“重塑”或“新建轴”添加标注

Python Numpy:使用“重塑”或“新建轴”添加标注,python,numpy,Python,Numpy,ndarray.reformate或numpy.newaxis可用于向数组添加新维度。它们似乎都创建了一个视图,使用一个视图而不是另一个视图有什么理由或优势吗 >>> b array([ 1., 1., 1., 1.]) >>> c = b.reshape((1,4)) >>> c *= 2 >>> c array([[ 2., 2., 2., 2.]]) >>> c.shape (1, 4)

ndarray.reformate
numpy.newaxis
可用于向数组添加新维度。它们似乎都创建了一个视图,使用一个视图而不是另一个视图有什么理由或优势吗

>>> b
array([ 1.,  1.,  1.,  1.])
>>> c = b.reshape((1,4))
>>> c *= 2
>>> c
array([[ 2.,  2.,  2.,  2.]])
>>> c.shape
(1, 4)
>>> b
array([ 2.,  2.,  2.,  2.])
>>> d = b[np.newaxis,...]
>>> d
array([[ 2.,  2.,  2.,  2.]])
>>> d.shape
(1, 4)
>>> d *= 2
>>> b
array([ 4.,  4.,  4.,  4.])
>>> c
array([[ 4.,  4.,  4.,  4.]])
>>> d
array([[ 4.,  4.,  4.,  4.]])
>>> 

`我看不出有什么不同的证据。您可以在非常大的阵列上进行时间测试。基本上,两者都会摆弄形状,可能还会摆弄步伐<代码>\uuuu数组\u接口\uuuu是访问此信息的好方法。例如:

In [94]: b.__array_interface__
Out[94]: 
{'data': (162400368, False),
 'descr': [('', '<f8')],
 'shape': (5,),
 'strides': None,
 'typestr': '<f8',
 'version': 3}

In [95]: b[None,:].__array_interface__
Out[95]: 
{'data': (162400368, False),
 'descr': [('', '<f8')],
 'shape': (1, 5),
 'strides': (0, 8),
 'typestr': '<f8',
 'version': 3}

In [96]: b.reshape(1,5).__array_interface__
Out[96]: 
{'data': (162400368, False),
 'descr': [('', '<f8')],
 'shape': (1, 5),
 'strides': None,
 'typestr': '<f8',
 'version': 3}

有趣的观察结果是:
b.重塑(1,4).跨步->(32,8)

这是我的猜测<代码>数组接口显示一个底层属性,
.strips
更像一个属性(尽管它可能都隐藏在C代码中)。默认的基础值是
None
,当需要计算时(或显示为
.strips
),它会根据形状和项目大小进行计算
32
是到第1行(4x8)末端的距离
np.ones((2,4)).strips
\uuu数组\u接口中具有相同的
(32,8)
(和

另一方面,
b[None,:]
正在为广播准备数组。广播时,重复使用现有值。这就是
(0,8)
中的
0
所做的

In [147]: b1=np.broadcast_arrays(b,np.zeros((2,1)))[0]

In [148]: b1.shape
Out[148]: (2, 5000)

In [149]: b1.strides
Out[149]: (0, 8)

In [150]: b1.__array_interface__
Out[150]: 
{'data': (3023336880L, False),
 'descr': [('', '<f8')],
 'shape': (2, 5),
 'strides': (0, 8),
 'typestr': '<f8',
 'version': 3}
[147]中的
:b1=np.广播_数组(b,np.零((2,1))[0]
In[148]:b1.shape
Out[148]:(25000)
In[149]:b1.跨步
Out[149]:(0,8)
In[150]:b1.\u数组\u接口__
出[150]:
{'data':(3023336880L,假),

“descr”:[(“”,在
ndarray.restrape
上使用
numpy.newaxis
的一个原因是当您有多个“未知”维度要使用时。例如,对于以下数组:

>>> arr.shape
(10, 5)
这项工作:

>>> arr[:, np.newaxis, :].shape
(10, 1, 5)
但这并不是:

>>> arr.reshape(-1, 1, -1)
...
ValueError: can only specify one unknown dimension

很酷,
\uuuuuuuuuuuuuuuu接口
!!Hmmm
b.重塑(1,4).步幅->(32,8)
b[无]。步幅->(0,8)
很有趣。我在这方面添加了一些想法。
…为广播准备数组听起来不错。
因此第一步维度/值的零会迫使它在广播过程中从头开始。这也可能解释
C_连续
的差异。
b.重塑(1,-1)
是方便的快捷方式。
>>> arr.reshape(-1, 1, -1)
...
ValueError: can only specify one unknown dimension