微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

优雅高效的 Numpy 数组操作 - np.linspace

如何解决优雅高效的 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 举报,一经查实,本站将立刻删除。