当前位置: 首页 > 知识库问答 >
问题:

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.]])
>>> 

`

共有2个答案

翟聪
2023-03-14
匿名用户

我看不出有什么不同。您可以在非常大的数组上进行时间测试。基本上都是摆弄形状,可能还有步幅。__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}

两者都使用与原始视图相同的数据缓冲区创建视图。相同的形状,但“重塑”不会更改步幅<代码>重塑用于指定顺序

。标志显示C_连续标志中的差异。

重塑可能更快,因为它所做的更改更少。但无论哪种方式,操作都不会对大型计算的时间产生太大影响。

e、 g.对于大型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.重塑(1,4)。跨步-

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

b1np.ones((2,5))显示相同,但只有5项。

np。广播数组是/numpy/lib/stride\u技巧中的一个函数。py。它使用同一文件中的。这些函数直接使用“形状”和“步幅”属性。

岑驰
2023-03-14

使用numpy的一个原因。新建轴overndarray。重塑是指有多个“未知”维度需要操作时。例如,对于以下数组:

>>> arr.shape
(10, 5)

这项工作:

>>> arr[:, np.newaxis, :].shape
(10, 1, 5)

但这并不:

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

 类似资料:
  • 问题内容: 任一或可用于一个新的维度添加到一个数组。他们俩似乎都在创建一个视图,是否有任何理由或优势使用一个而不是另一个? ` 问题答案: 我看不出有太大差异的证据。您可以对非常大的阵列进行时间测试。基本上,两者都摆弄形状,甚至大步向前。 是访问此信息的好方法。例如: 两者都使用与原始缓冲区相同的缓冲区来创建视图。形状相同,但重塑不会改变。 让您指定。 并显示标志中的差异。 可能会更快,因为它所做

  • 问题内容: tl; dr是否 可以在不使用numpy.reshape的情况下将numpy数组的视图从5x5x5x3x3x3重塑为125x1x1x3x3x3? 我想对一个体积(大小为MxMxM)执行一个滑动窗口操作(具有不同的步幅)。如本杰明(Benjamin)和艾肯伯格(Eickenberg)先前建议的那样,可以使用生成滑动窗口数组,并在下面的代码片段中进行了演示,该代码片段使用了skimage中

  • 我在HTTP路由中非常成功地使用了Cro HTTP身份验证/授权/会话。 然后我添加了一个路由,使用创建一个,并且我可以使用和一切工作正常。 现在我想控制对websocket的访问,所以我添加了一个参数。效果很好。现在,客户端得到了一个

  • 我已经看到了这个答案,并且正在使用它所建议的解决方案,但仍然得到相同的错误。 我有一个对用户表有外键约束的代理表,这是代理表: 这是我的实体: 现在,我想为现有用户添加一个新代理: <代码>\u上下文。SaveChanges() 行引发以下异常: "无法添加或更新子行:外键约束失败(\"dbName\".\"agent\", CONSTRAINT\"FK_Agency_User\"FOREIGN

  • 问题内容: 我想在两个不同的子图中绘制数据。绘制后,我想回到第一个子图并在其中绘制另一个数据集。但是,这样做时会收到以下警告: MatplotlibDeprecationWarning:当前使用与以前的轴相同的参数添加轴现在会重用之前的实例。在将来的版本中,将始终创建并返回一个新实例。同时,通过向每个轴实例传递唯一的标签,可以抑制此警告,并确保将来的行为。warnings.warn(消息,mplD

  • 我有一个包含在StreamBuilder中的刷新指标。每当StreamBuilder添加了新数据时,刷新指标都会重建其Listview。建筑商在这个过程中跳到了顶端。 StreamBuilder(stream: apiResultStream.stream,Builder:(BuildContext上下文,AsyncSnapshot快照){if(snapshot.has错误){print(有错误)