当我编写一个接受ndarray
或scalar
输入
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
函数?基本上我想要的是一个可以投射的功能:
a
,scalar
到ndarray
,形状为((1,)*x)
b
,ndarray
y<x
明确暗淡形成((1,) * (y-x) + b.shape)
(与广播相同)c
,ndarray
dim x
不受影响d
,ndarray
y>x
dims会抛出错误似乎这个功能在内置函数中经常重复,应该有一些快捷方式,但我没有找到它。
我可以a_ = np.array(a, ndmin = x, copy = False)
然后assert len(a_.shape) == x)
,但仍然可以复制数组。 (即a_.base is a
是False
)。有没有办法解决?
答案 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
,