我经常尝试将一堆数组放在不同的维度,如下所示,
x = x.reshape((x.size, 1, 1))
y = y.reshape((1, y.size, 1))
z = z.reshape((1, 1, z.size))
return x + y + z
我有两个问题,我想这样做,
x = x.todim(0)
y = y.todim(1)
z = z.todim(2)
并实现与上述相同。
另外,我想用不同的运算符做"张量积",并让它被懒惰地评估,因为做我正在做的事情经常会爆炸内存使用。但我做这些事情确实有一个很好的理由……我的疯狂是有道理的。
编辑:这是我写的代码,但内置的会更好,如果这样存在
def todim(a, ndims, axis=0):
nshape = [a.shape[i-axis]
if i >= axis and (i-axis) < len(a.shape)
else 1
for i in range(ndims)]
return a.reshape(tuple(nshape))
首先,您正在做类似于np.ix_
的事情。
In [899]: x,y,z=np.ix_(np.arange(3),np.arange(4),np.arange(5))
In [900]: x.shape,y.shape,z.shape
Out[900]: ((3, 1, 1), (1, 4, 1), (1, 1, 5))
numpy.lib.index_tricks.py
有这个和其他索引函数和类。
像todim
这样的函数可以是:
def todim(x,n,i):
ind = [1]*n
ind[i]=x.shape[0]
return x.reshape(ind)
我并不是想让它成为一个数组方法。独立函数更容易。我还需要定义n
,目标维度数。np.ix_
是这样做的。
你添加的todim
(当我写我的答案时)是相似的,但让x
有1d以外的东西。
np.r_
接受一个可能允许类似规范的初始字符串实参。
x,y,z = np.r_['0,3,0',np.arange(3)], np.r_['0,3,1',np.arange(4)], np.r_['0,3,2',np.arange(5)]
生成与初始ix_
相同的3个数组。它接受字符串输入,但您也可以轻松地插入数字:
np.r_['0,%s,%s'%(3,1), np.arange(4)]