文章目录:
前言1.ndarray.ndim【例1】返回数组的维数
2.ndarray.shape【例2】返回数组的维度
3.ndarray.size【例3】返回数组元素的总个数
4.ndarray.dtype【例4】返回数组的元素类型
5.ndarray.itemsize【例5】返回数组中每一个元素的大小
6.ndarray.flags【例6】返回数组的内存信息
7.ndarray.real和ndarray.imag【例7】返回数组的实部和虚部
8.ndarray.data【例8】返回数组的缓冲区
注:为了节约行数,默认import numpy as np已经写在每段代码前,不再重复写入,如果有新的包引入,会在代码头部import
前言
在学过数组的创建之后,需要对数组进行进一步的了解,可以先从数组属性入手,Numpy中比较重要的数组属性如下:
属性说明
ndarray.ndim秩,即轴的数量或维度的数量ndarray.shape数组的维度,对于矩阵,n 行 m 列ndarray.size数组元素的总个数,相当于 .shape 中 n*m 的值ndarray.dtypendarray 对象的元素类型ndarray.itemsizendarray 对象中每个元素的大小,以字节为单位ndarray.flagsndarray 对象的内存信息ndarray.realndarray 元素的实部(复数的实部)ndarray.imagndarray 元素的虚部(复数的虚部)ndarray.data包含实际数组元素的缓冲区,由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。
接下来让我们分别介绍。
1.ndarray.ndim
NumPy 数组的维度(又称维数)称为秩(rank),一维数组的秩为 1,二维数组的秩为 2,以此类推。 NumPy 中,每一个线性的数组称为是一个轴(axis),也就是维度(dimensions)。
【例1】返回数组的维数
>>>a
= np
.arange
(18)
>>>print(a
)
>>>print(a
.ndim
)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
1
>>>b
= a
.reshape
(2,3,3)
>>>print(b
)
>>>print(b
.ndim
)
[[[ 0 1 2]
[ 3 4 5]
[ 6 7 8]]
[[ 9 10 11]
[12 13 14]
[15 16 17]]]
3
>>>print(a
)
[ 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17]
我们首先创建了一个1维Numpy数组a,数组元素有18个,通过ndarray.ndim属性可以查看数组a的维数是1。然后通过reshape方法生成数组b(注:此时数组a不被改变),然后打印数组b的维数为3。
2.ndarray.shape
【例2】返回数组的维度
>>>a
= [x
+1 for x
in range(3)]
>>>b
= [x
+3 for x
in a
]
>>>c
= np
.array
([a
]+[b
])
>>>print(c
.shape
,type(c
.shape
))
(2, 3) <class 'tuple'>
>>>d
= c
.reshape
(3,2)
>>>print(d
,d
.shape
,type(d
))
[[1 2]
[3 4]
[5 6]] <class 'numpy.ndarray'>
>>>c
.shape
= (3,2)
>>>print(c
,d
.shape
,type(c
))
[[1 2]
[3 4]
[5 6]] <class 'numpy.ndarray'>
可以看到shape属性可以返回数组的维度,在上述案例中,shape返回的是一个元组tuple。我们可以通过直接设置shape或者reshape改变一个数组的shape,请注意后者不直接改变原数组,而是生成一个新数组,如c生成了d,但是c本身没有变化,直到我们通过c.shape = (3,2)改变了它。
3.ndarray.size
【例3】返回数组元素的总个数
>>>a
= [x
+1 for x
in range(3)]
>>>b
= [x
+3 for x
in a
]
>>>def getSize
(data
):
>>> return np
.array
(data
).size
>>>print(getSize
(a
),getSize
(b
),getSize
([a
]+[b
]))
3 3 6
这里我们新建一个getSize函数,用来利用list新建ndarray数组并且返回其size。
4.ndarray.dtype
【例4】返回数组的元素类型
>>>x
= np
.arange
(5, dtype
= np
.int8
)
>>>print(x
.dtype
)
int8
>>>y
= np
.array
(5, dtype
= np
.int16
)
>>>print(y
.dtype
)
int16
这个在前面的数据类型里面有介绍,不加赘述。
5.ndarray.itemsize
【例5】返回数组中每一个元素的大小
>>>x
= np
.arange
(5, dtype
= np
.int8
)
>>>print (x
.itemsize
)
1
>>>y
= np
.array
(5, dtype
= np
.float64
)
>>>print (y
.itemsize
)
8
可以看到int8型数组元素大小为1字节,float64型数组元素大小为8字节。
6.ndarray.flags
属性描述
C_CONTIGUOUS ©数据是在一个单一的C风格的连续段中F_CONTIGUOUS (F)数据是在一个单一的Fortran风格的连续段中OWNDATA (O)数组拥有它所使用的内存或从另一个对象中借用它WRITEABLE (W)数据区域可以被写入,将该值设置为 False,则数据为只读ALIGNED (A)数据和所有元素都适当地对齐到硬件上UPDATEIFCOPY (U)这个数组是其它数组的一个副本,当这个数组被释放时,原数组的内容将被更新
【例6】返回数组的内存信息
>>>x
= np
.arange
(5, dtype
= np
.int8
)
>>>print(x
.flags
)
C_CONTIGUOUS
: True
F_CONTIGUOUS
: True
OWNDATA
: True
WRITEABLE
: True
ALIGNED
: True
WRITEBACKIFCOPY
: False
UPDATEIFCOPY
: False
这里比较重要的是 flags.owndata 属性,它表示该数组是否拥有数据,会配合后面的深浅复制使用。
7.ndarray.real和ndarray.imag
【例7】返回数组的实部和虚部
>>>x
= np
.sqrt
([1 + 0j, 2 + 1j])
>>>print(x
.real
)
>>>print(x
.imag
)
[1. 1.45534669]
[0. 0.34356075]
np.sqrt是numpy提供的求平方根的方法,运算后我们利用real和imag提取的实部和虚部
8.ndarray.data
【例8】返回数组的缓冲区
>>>x
= np
.arange
(5, dtype
= np
.int8
)
>>>print(x
.data
)
<memory at
0x000001FF29FDA280>
由于一般通过数组的索引获取元素,所以通常不需要使用这个属性。