将标量转换为numpy数组的有效方法

时间:2017-11-22 07:44:29

标签: python numpy

当我编写一个接受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)
  • bndarray y<x明确暗淡形成((1,) * (y-x) + b.shape)(与广播相同)
  • cndarray dim x不受影响
  • dndarray y>x dims会抛出错误
  • 就地完成所有操作(至少在从数组开始时),以防止双重内存

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

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

1 个答案:

答案 0 :(得分:2)

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`