如何解决优雅高效的 Numpy 数组操作 - np.linspace
我想从 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.],[2.,2.,2.],[3.,3.,3.]]),array([[10.,10.,10.],[20.,20.,20.],[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.]])
转置和重塑产生您的arr2
:
In [40]: np.linspace(arr/3,3).T
Out[40]:
array([[ 1.,2.,3.],[10.,20.,30.]])
In [41]: np.linspace(arr/3,3).T.reshape(2,-1,1)
Out[41]:
array([[[ 1.],[ 2.],[ 3.]],[[10.],[20.],[30.]]])
然后只需使用 repeat
(或平铺)将其展开:
In [42]: np.linspace(arr/3,1).repeat(4,-1)
Out[42]:
array([[[ 1.,1.,1.],2.],3.,3.]],[[10.,10.,[20.,[30.,30.,30.]]])
应用这些操作的另一个顺序:
np.linspace(arr/3,3).repeat(4,1).reshape(3,2,4).transpose(1,2)
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。