【问题标题】:Efficient way to cast scalars to numpy arrays将标量转换为 numpy 数组的有效方法
【发布时间】:2023-03-07 10:40:01
【问题描述】:

当我编写一个接受ndarrayscalar 输入的函数时

def foo(a):
    # does something to `a`
    #
    # a: `x` dimensional array or scalar
    # . . . 

    cast(a, x)
    # deal with `a` as if it is an `x`-d array after this

有没有一种有效的方式来编写cast 函数?基本上我想要的是一个可以转换的函数:

  • ascalarndarray,形状为 ((1,)*x)
  • bndarrayy<x 显式调暗以塑造 ((1,) * (y-x) + b.shape)(与广播相同)
  • cndarrayx 不受影响
  • dndarrayy>x dims 会引发错误
  • 就地执行所有操作(至少在从数组开始时),以防止双重内存

似乎这个功能在内置函数中经常重复,应该有一些快捷方式,但我没有找到它。

我可以先做 a_ = np.array(a, ndmin = x, copy = False) 然后 assert len(a_.shape) == x) ,但这仍然会复制数组。 (即a_.base is aFalse)。有没有办法解决?

【问题讨论】:

  • np.array 采用 copy 参数。我们刚刚在astype 中探索了该参数。像atleast_3d 这样的函数使用asarray 后跟一些newaxis 整形。 np.expand_dims 也可能会给出想法。这些操作中的大多数都生成视图,而不是副本。只有x.shape=...“就地”改变形状。
  • np.asarraynp.arraycopy=False
  • @hpaulj np.asarray 不采用 ndmin 参数。不知何故,np.array(a, ndmin = x, copy = False) 仍然为我复制了一个数组
  • 复制为新 id 或新数据缓冲区指针?

标签: python numpy


【解决方案1】:

asarray 返回数组本身(如果以数组开头):

In [271]: x=np.arange(10)
In [272]: y = np.asarray(x)
In [273]: id(x)
Out[273]: 2812424128
In [274]: id(y)
Out[274]: 2812424128     # same id

ndmin 产生一个视图:

In [276]: y = np.array(x, ndmin=2, copy=False)
In [277]: y
Out[277]: array([[0, 1, 2, 3, 4, 5, 6, 7, 8, 9]])
In [278]: id(x)
Out[278]: 2812424128
In [279]: id(y)
Out[279]: 2811135704    # different id
In [281]: x.__array_interface__['data']
Out[281]: (188551320, False)
In [282]: y.__array_interface__['data']  # same databuffer
Out[282]: (188551320, False)

ndmin 已经在右暗的数组上:

In [286]: x = np.arange(9).reshape(3,3)
In [287]: y = np.array(x, ndmin=2, copy=False)
In [288]: id(x)
Out[288]: 2810813120
In [289]: id(y)
Out[289]: 2810813120     # same id

astype类似的讨论,

confused about the `copy` attribution of `numpy.astype`

【讨论】:

  • 嗯。如果我查看.flags.base 似乎是一个新数组,但.__array_interface__['data'] 是一样的吗?这有点误导。
猜你喜欢
  • 2022-12-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-10
  • 1970-01-01
  • 2018-11-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多