Python 如何更改阵列布局?

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 -

转换以下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 -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)
带和的一种方法-

另一个带有and
np.连接-

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