Python 如何更改阵列布局?
转换以下numpy阵列的有效方法是什么:Python 如何更改阵列布局?,python,arrays,numpy,Python,Arrays,Numpy,转换以下numpy阵列的有效方法是什么: a1 = \ [[ 1.1 -1.1 0.1] [ 2.1 -2.1 0.1] [ 3.1 -3.1 0.1] [ 4.1 -4.1 0.1] [ 5.1 -5.1 0.1]] 及 变成一个: [[[ 1.1 1.2] [ 2.1 2.2] [ 3.1 3.2] [ 4.1 4.2] [ 5.1 5.2]] [[-1.1 -1.2] [-2.1 -2.2] [-3.1 -3.2] [-4.1 -
a1 = \
[[ 1.1 -1.1 0.1]
[ 2.1 -2.1 0.1]
[ 3.1 -3.1 0.1]
[ 4.1 -4.1 0.1]
[ 5.1 -5.1 0.1]]
及
变成一个:
[[[ 1.1 1.2]
[ 2.1 2.2]
[ 3.1 3.2]
[ 4.1 4.2]
[ 5.1 5.2]]
[[-1.1 -1.2]
[-2.1 -2.2]
[-3.1 -3.2]
[-4.1 -4.2]
[-5.1 -5.2]]
[[ 0.1 0.2]
[ 0.1 0.2]
[ 0.1 0.2]
[ 0.1 0.2]
[ 0.1 0.2]]]
是否有不复制数据的方法(例如,修改a中的值也会修改a1或a2中的相应值)
UPD。以下是我曾经使用过的一个公认的答案和方法——因为复制最终是强制性的:
import numpy as np
a1 = [[ 1.1, -1.1, 0.1],
[ 2.1, -2.1, 0.1],
[ 3.1, -3.1, 0.1],
[ 4.1, -4.1, 0.1],
[ 5.1, -5.1, 0.1]]
a1 = np.array(a1)
a2 = [[ 1.2, -1.2, 0.2],
[ 2.2, -2.2, 0.2],
[ 3.2, -3.2, 0.2],
[ 4.2, -4.2, 0.2],
[ 5.2, -5.2, 0.2]]
a2 = np.array(a2)
a_expected = [[[ 1.1, 1.2],
[ 2.1, 2.2],
[ 3.1, 3.2],
[ 4.1, 4.2],
[ 5.1, 5.2]],
[[-1.1, -1.2],
[-2.1, -2.2],
[-3.1, -3.2],
[-4.1, -4.2],
[-5.1, -5.2]],
[[ 0.1, 0.2],
[ 0.1, 0.2],
[ 0.1, 0.2],
[ 0.1, 0.2],
[ 0.1, 0.2]]]
npar = 2
a = np.concatenate((a1[...,None].transpose(1,0,2), a2[...,None].transpose(1,0,2)), npar)
assert np.all(a == a_expected)
new_a1 = a.transpose(2, 1, 0)[0]
new_a2 = a.transpose(2, 1, 0)[1]
assert np.all(new_a1 == a1)
assert np.all(new_a2 == a2)
带和的一种方法-
另一个带有andnp.连接-
np.concatenate((a1.T[...,None],a2.T[...,None]),2)
带有ndarray.transpose
和-
运行时测试-
In [63]: a1 = np.random.rand(500,300)
...: a2 = np.random.rand(500,300)
...:
In [64]: %timeit np.concatenate((a1[...,None].transpose(1,0,2),a2[...,None].transpose(1,0,2)),2)
100 loops, best of 3: 3.02 ms per loop
In [65]: %timeit np.concatenate((a1.T[...,None],a2.T[...,None]),2)
100 loops, best of 3: 3.03 ms per loop
In [66]: %timeit np.dstack((a1,a2)).transpose(1,0,2)
100 loops, best of 3: 3.05 ms per loop
In [67]: a1 = np.random.rand(5000,3000)
...: a2 = np.random.rand(5000,3000)
...:
In [68]: %timeit np.concatenate((a1[...,None].transpose(1,0,2),a2[...,None].transpose(1,0,2)),2)
1 loops, best of 3: 372 ms per loop
In [69]: %timeit np.concatenate((a1.T[...,None],a2.T[...,None]),2)
1 loops, best of 3: 373 ms per loop
In [70]: %timeit np.dstack((a1,a2)).transpose(1,0,2)
1 loops, best of 3: 371 ms per loop
看起来,两个都是不错的选择。一般来说,考虑到a1
和a2
,没有复制就无法形成a
。每个NumPy数组都包含一个指向连续内存块开头的指针。然后,它使用步幅、形状和数据类型来定位数组中的值。如果a1
和a2
中的底层数据不是一个连续内存块的一部分,那么如果不复制,就无法将它们连接到一个新的NumPy数组A
,因为新数组只能有一个指针、一个跨步、一个形状和一个数据类型。
np.concatenate((a1.T[...,None],a2.T[...,None]),2)
np.dstack((a1,a2)).transpose(1,0,2)
In [63]: a1 = np.random.rand(500,300)
...: a2 = np.random.rand(500,300)
...:
In [64]: %timeit np.concatenate((a1[...,None].transpose(1,0,2),a2[...,None].transpose(1,0,2)),2)
100 loops, best of 3: 3.02 ms per loop
In [65]: %timeit np.concatenate((a1.T[...,None],a2.T[...,None]),2)
100 loops, best of 3: 3.03 ms per loop
In [66]: %timeit np.dstack((a1,a2)).transpose(1,0,2)
100 loops, best of 3: 3.05 ms per loop
In [67]: a1 = np.random.rand(5000,3000)
...: a2 = np.random.rand(5000,3000)
...:
In [68]: %timeit np.concatenate((a1[...,None].transpose(1,0,2),a2[...,None].transpose(1,0,2)),2)
1 loops, best of 3: 372 ms per loop
In [69]: %timeit np.concatenate((a1.T[...,None],a2.T[...,None]),2)
1 loops, best of 3: 373 ms per loop
In [70]: %timeit np.dstack((a1,a2)).transpose(1,0,2)
1 loops, best of 3: 371 ms per loop