任一ndarray.reshape
或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.]])
>>>
Run Code Online (Sandbox Code Playgroud)
`
Raf*_*ins 22
使用numpy.newaxis
over 的原因之一ndarray.reshape
是当您有多个“未知”维度可供操作时。因此,例如,对于以下数组:
>>> arr.shape
(10, 5)
Run Code Online (Sandbox Code Playgroud)
这有效:
>>> arr[:, np.newaxis, :].shape
(10, 1, 5)
Run Code Online (Sandbox Code Playgroud)
但这不会:
>>> arr.reshape(-1, 1, -1)
...
ValueError: can only specify one unknown dimension
Run Code Online (Sandbox Code Playgroud)
hpa*_*ulj 16
我没有看到有太大差异的证据.您可以对非常大的阵列进行时间测试.基本上都是摆弄形状,可能是步幅. __array_interface__
是访问此信息的好方法.例如:
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}
Run Code Online (Sandbox Code Playgroud)
两者都使用与data
原始缓冲区相同的缓冲区创建视图.相同的形状,但重塑不会改变strides
. reshape
让你指定order
.
并.flags
显示C_CONTIGUOUS
旗帜的差异.
reshape
可能会更快,因为它做的更少.但无论哪种方式,操作都不应该影响更大计算的时间.
例如大 b
In [123]: timeit np.outer(b.reshape(1,-1),b)
1 loops, best of 3: 288 ms per loop
In [124]: timeit np.outer(b[None,:],b)
1 loops, best of 3: 287 ms per loop
Run Code Online (Sandbox Code Playgroud)
有趣的观察: b.reshape(1,4).strides -> (32, 8)
这是我的猜测. .__array_interface__
正在显示一个底层属性,.strides
它更像是一个属性(尽管它可能都隐藏在C代码中).默认的基础值是None
,当需要进行计算(或显示.strides
)时,它会根据形状和项目大小进行计算.32
是到第1行末尾的距离(4x8). np.ones((2,4)).strides
具有相同的(32,8)
(和None
在__array_interface__
.
b[None,:]
另一方面,正在准备用于广播的阵列.广播时,重复使用现有值.这就是0
in的(0,8)
功能.
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}
Run Code Online (Sandbox Code Playgroud)
b1
显示相同np.ones((2,5))
但只有5个项目.
np.broadcast_arrays
是一个功能/numpy/lib/stride_tricks.py
.它使用as_strided
来自同一个文件.这些函数直接使用shape和strides属性.
归档时间: |
|
查看次数: |
10374 次 |
最近记录: |