我想从arr创建更漂亮的arr3。我会将对于大量行(~10^7)最优雅和最有效的解决方案标记为可接受的答案。
>>> arr = np.array([3,30])
>>> arr
array([ 3, 30])
>>> arr2 = np.array([np.linspace(arr[i]/3, arr[i], 3).reshape(-1,1)
for i in range(len(arr))])
>>> list(arr2)
[array([[1.],
[2.],
[3.]]),
array([[10.],
[20.],
[30.]])]
>>> arr3 = np.tile(arr2,4)
>>> list(arr3)
[array([[1., 1., 1., 1.],
[2., 2., 2., 2.],
[3., 3., 3., 3.]]),
array([[10., 10., 10., 10.],
[20., 20., 20., 20.],
[30., 30., 30., 30.]])]
我相信从 np.linspace 创建一个更高维的数组可以立即到达 arr2 甚至 arr3 但我不确定如何,尽管如果这不是最好的方法,您不必使用 np.linspace。
第二个问题:如果需要转置arr3内部的两个数组,如何直接从arr实现这一点?从 arr3 来看很简单,但也许有一种更直接的方法类似于原始问题。
谢谢!
最佳答案
In [38]: arr
Out[38]: array([ 3, 30])
linspace
允许我们指定数组作为端点:
In [39]: np.linspace(arr/3, arr, 3)
Out[39]:
array([[ 1., 10.],
[ 2., 20.],
[ 3., 30.]])
转置和 reshape 生成您的arr2
:
In [40]: np.linspace(arr/3, arr, 3).T
Out[40]:
array([[ 1., 2., 3.],
[10., 20., 30.]])
In [41]: np.linspace(arr/3, arr, 3).T.reshape(2,-1,1)
Out[41]:
array([[[ 1.],
[ 2.],
[ 3.]],
[[10.],
[20.],
[30.]]])
然后只需使用repeat
(或平铺)即可展开它:
In [42]: np.linspace(arr/3, arr, 3).T.reshape(2,-1,1).repeat(4,-1)
Out[42]:
array([[[ 1., 1., 1., 1.],
[ 2., 2., 2., 2.],
[ 3., 3., 3., 3.]],
[[10., 10., 10., 10.],
[20., 20., 20., 20.],
[30., 30., 30., 30.]]])
应用这些操作的另一个命令:
np.linspace(arr/3,arr,3).repeat(4,1).reshape(3,2,4).transpose(1,0,2)
关于arrays - 优雅高效的 Numpy 数组运算 - np.linspace,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67041143/