当前位置: 首页 > 面试题库 >

numpy:使用重塑形状或换新轴添加尺寸

洪捷
2023-03-14
问题内容

任一ndarray.reshapenumpy.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.]])
>>>

`


问题答案:

我看不出有太大差异的证据。您可以对非常大的阵列进行时间测试。基本上,两者都摆弄形状,甚至大步向前。
__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}

两者都使用与data原始缓冲区相同的缓冲区来创建视图。形状相同,但重塑不会改变stridesreshape让您指定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

有趣的发现: b.reshape(1,4).strides -> (32, 8)

这是我的猜测。
.__array_interface__正在显示基础属性,并且.strides更像是一个属性(尽管它可能全部埋在了C代码中)。默认基础值是None,并且在需要计算(或显示为.strides)时,会根据形状和商品尺寸进行计算。32是到第一行末尾的距离(4x8)。
np.ones((2,4)).strides具有相同的(32,8)(和None__array_interface__

b[None,:]另一方面正在为广播准备阵列。广播时,将重复使用现有值。这就是0in的(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}

b1显示与相同,np.ones((2,5))但只有5个项目。

np.broadcast_arrays是中的功能/numpy/lib/stride_tricks.py。它使用as_strided来自同一文件。这些函数直接与shape和stride属性一起使用。



 类似资料:
  • 可以使用或向数组添加新的维度。它们似乎都创造了一种观点,有什么理由或优势使用一种而不是另一种吗? `

  • Navicat Data Modeler 包含一些用于创建数据库模型图表的预定义形状:线条、箭头、矩形、椭圆、用户、数据库、云形、触发器、服务器、桌面或移动设备。若要创建一个新形状,点击工具栏的 “形状”按钮并选择一种形状。然后,点击画布的任意位置。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 在画布中形状对象的弹出式菜单选项包括: 选项 描述 重设高宽比率 保持形

  • Navicat Data Modeler 包含一些用于创建数据库模型图表的预定义形状:线条、箭头、矩形、椭圆、用户、数据库、云形、触发器、服务器、桌面或移动设备。若要创建一个新形状,点击工具栏的 “形状”按钮并选择一种形状。然后,点击画布的任意位置。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 在画布中形状对象的弹出式菜单选项包括: 选项 描述 重设高宽比率 保持形

  • Navicat 包含一些用于创建仪表板的预定义形状:线条、箭头。 添加一个形状 在仪表板选项卡中,点击 “添加形状”并选择一种形状类型。 将其放在仪表板上。 属性 形状的可用属性: 选项 描述 位置 自定义形状的位置。 颜色 设置形状的颜色。 线条宽度 选择线条或箭头的宽度。 端点样式 选择线条或箭头的端点样式。 虚线样式 选择线条或箭头的虚线样式。 联接样式 选择线条或箭头的联接样式。 箭头开始

  • Navicat 包含一些用于创建数据库模型图表的预定义形状:线条、箭头、矩形、椭圆、用户、数据库、云形、触发器、服务器、桌面或移动设备。若要创建一个新形状,点击工具栏的 按钮并选择一种形状。然后,点击画布的任意位置。若要显示或隐藏链接的名标签,简单地在属性窗格中勾选或取消勾选“显示名”选项。 在画布中形状对象的弹出式菜单选项包括: 选项 描述 重置高宽比率 保持形状的原始宽度与高度的比率。 仅适用

  • Navicat 包含一些用于创建仪表板的预定义形状:线条、箭头。 添加一个形状 在仪表板选项卡中,点击 并选择一种形状类型。 将其放在仪表板上。 属性 形状的可用属性: 选项 描述 位置 自定义形状的位置。 颜色 设置形状的颜色。 线条宽度 选择线条或箭头的宽度。 端点样式 选择线条或箭头的端点样式。 虚线样式 选择线条或箭头的虚线样式。 联接样式 选择线条或箭头的联接样式。 箭头开始样式 选择箭