我经常最终尝试将一堆数组放在不同的维度中,如下所示,
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))
答案 0 :(得分:1)
首先,您正在执行与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)]