java二维数组转换为拼接字符串 java二维数组转置输出_用指针将33矩阵转置


0. 前言

转置是重塑的一种特殊形式。转置返回源数组的视图,源数组和对源数组进行转置操作后返回的数组指向的是同一个地址。Numpy中有三种方式能够对数组进行转置操作:

  1. T属性
  2. transpose方法
  3. swapaxes方法
import


1. 二维和高维数组的转置

需要注意的是只有二维数组(矩阵)以及更高维度的数组才能够进行转置操作,对Numpy中的一维数组进行转置操作是没有用的。


import numpy as np

# 一维数组
array = np.array([1,2,3,4])

print(array)
print(array.shape)
print(array.T)

[1 2 3 4]
(4,)
[1 2 3 4]


不能把一维数组或者调用shape属性返回元组为"( 元素个数 , )"这样的数组进行转置操作。在Numpy中既可以使用一维数组表示向量,也可以使用二维数组矩阵的形式表示向量。比如使用一维数组表示的向量可以使用dot函数计算两个向量之间的内积,但是如果使用二维数组表示的向量使用dot函数就需要依据矩阵乘法的运算法则来计算。这里主要介绍进行转置运算的方式,所以不再展开赘述,以后会有更加详细的介绍。

有三种方式可以将一维数组表示的向量转换为二维数组表示的向量:


import numpy as np

array = np.array([1,2,3,4])

print("-----方式一-----")
A = array.reshape(1,array.shape[0])
print(A)
print(A.shape)
print("-----方式二-----")
B = array[:,np.newaxis]
print(B)
print(B.shape)
print("-----方式三-----")
array.shape = (4,1)
print(array)
print(array.shape) 

-----方式一-----
[[1 2 3 4]]
(1, 4)
-----方式二-----
[[1]
 [2]
 [3]
 [4]]
(4, 1)
-----方式三-----
[[1]
 [2]
 [3]
 [4]]
(4, 1)


这里要注意一下reshape函数:


import numpy as np

array = np.arange(12).reshape((3,4))
array2 = array.reshape((3,4))
print("-----源数据-----")
print(array)
print(array2)
print("-----修改后的数据-----")
array2[0] = 10000
print(array)
print(array2)

-----源数据-----
[[ 0  1  2  3]
 [ 4  5  6  7]
 [ 8  9 10 11]]
[[ 0  1  2]
 [ 3  4  5]
 [ 6  7  8]
 [ 9 10 11]]
-----修改后的数据-----
[[10000 10000 10000     3]
 [    4     5     6     7]
 [    8     9    10    11]]
[[10000 10000 10000]
 [    3     4     5]
 [    6     7     8]
 [    9    10    11]]


使用reshape函数返回的是源数组的视图,换句话说如果我们修改源数组,源数组自身也会被修改,它们操作的对象是同一个。

2. T属性

T属性使用非常简单,使用T属性比较适用处理低维数组的转置操作(并不意味着它不能应用在高维数组上),正因为如此在实际操作中对矩阵(二维数组)的转置通常使用T属性。

即使是使用一维数组表示的向量我们也可以将其转化为二维数组的矩阵形式,所以这里直接使用二维数组进行演示。


import


通过实验结果来观察T的属性在高维数组上的应用,使用T属性和后面要介绍的transpose函数差不多,只不过T属性不能指定,只能使用的默认的转置方式,而transpose函数可以指定转置方式。


import


java二维数组转换为拼接字符串 java二维数组转置输出_java二维矩阵怎么进行转置_02

输出的结果


java二维数组转换为拼接字符串 java二维数组转置输出_java二维矩阵怎么进行转置_03

各元素对应的位置

从上面各元素对应位置的图表可以很清楚的看出,使用T属性对高维数组进行转置,只能交换位置序列的第一个值和最后一个值,并且不能够指定。

3. transpose方法

通过前面的学习可以知道T属性非常适合处理二维数组矩阵,不过对于高维数组,T属性只能对第一个位置和最后一个位置进行转换并且不能指定。

不过transpose函数能够非常方便的处理高维数组的转置。在介绍多维数组的转置之前,来看看如何使用transpose函数对二维数组矩阵进行转置。


import


import


介绍完了二维数组,接下来看一看transpose函数如何对高维数组进行转置。对于高维数组来说,transpose需要用到一个由编号组成的元组,这样才能进行转置,其实上面在介绍T属性的时候已经分析过了,这里说的编号对应的是形状元组的位置,这样说应该很抽象,我们以实际三维数组为例进行分析:


array


java二维数组转换为拼接字符串 java二维数组转置输出_java二维矩阵怎么进行转置_04

对应关系

继续看下面的代码:


import


java二维数组转换为拼接字符串 java二维数组转置输出_java二维矩阵怎么进行转置_05

打印输出结果

从上面我们可以看见输出结果并没有发生任何的改变,那我们再来看一个例子:


import


java二维数组转换为拼接字符串 java二维数组转置输出_转置_06

输出结果

可以看出和前面使用T属性进行转置的效果是一样的,我想你一定看出了这其中的奥秘所在,默认的元组中的顺序是(0,1,2),我们调用transpose(元组序列),这里我们传入的参数是(2,1,0)。对比一下会发现,第一个元素位置和最后一个元素的位置发生了改变。

4. swapaxes方法

ndarray还有一个swapaxes函数,它需要接受一对轴编号。先看一个有趣的东西:


import


java二维数组转换为拼接字符串 java二维数组转置输出_java二维数组转换为拼接字符串_07

输出结果

这里为了方便都将第一个轴和最后一个轴进行转置,三种转置方式得到的结果是一样的,不过可以看出swapaxes是以轴为单位的,并且只能传入两个轴参数。下面是二维数组的axis顺序,如果是三维数组的话还有一个axis 2的轴,以此类推。


java二维数组转换为拼接字符串 java二维数组转置输出_数组_08

二维数组的轴

对于三维数组来说,三个轴分别为axis 0,axis 1,axis 2,这些轴就这些转置操作所变换的对象。