Numpy - ndarray 结构

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Numpy - ndarray 结构相关的知识,希望对你有一定的参考价值。

参考技术A 使用 np.array(list) 函数构造一个 ndarray :

使用 dtype 获取 ndarray 中数据的类型:

使用 itemsize 属性获取 ndarray 中每个 item 占用的字节

使用 size 属性获取 ndarray 一个包含多少个 item:

使用 nbytes 属性获取 ndarray 所有 item 占用的字节总数:

使用 shape 属性获取 ndarray 的数组结构:

使用 ndim 属性获取维度:

使用布尔索引,可以实现对 ndarray 中数据的筛选:

也可以使用 np.where() 筛选 ndarray 中符合指定条件的数据对应的索引位置:

获取多维 ndarray 的属性:

多维 ndarray 的索引与切片

上述的赋值操作,并没有在内存中创建一个新的 ndarray ,因此 arr_np4 和 arr_np4_1 本质上指向的是一个对象:

想要在内存中创建一个新的独立的 ndarray ,需要使用 ndarray.copy() 方法:

使用 np.array() 构造 ndarray 时指定 dtype 类型:

使用 np.asarray ,通过现有的 ndarray 构造新的 ndarray :

使用 arr.astype ,也可以返回新的 ndarray :

Python3 NumPy库之ndarray数组

在Python内置环境 中,直接存储数值的数组(array)对象只存在一维结构,无法支持多维结构,也没有相关数组运算函数,这些使得Python在数值运算上有诸多不便之处。为了弥补这些不足,第三 方函数库NumPy被整合开发出来。

NumPy的核心功能是高维数组,NumPy 库中的ndarray (N-dimensional array object) 对象支持多维数组,数组类型的对象本身具备大小固定、数组内元素的数据类型相同等特性。NumPy也提供了大量数值运算函数,能够直接有效地进行向量、矩阵运算。

我们可以调用NumPy库的array(),arange(),zeros(),等函数方便的创建ndarray数组对象。

import numpy as np

array=np.array(range(6))
type(array)
Out[24]: numpy.ndarray

print(array)
Out[25]: array([0, 1, 2, 3, 4, 5])

一、如何创建ndarray数组

1、使用array()函数创建ndarray数组
array=np.array(range(6))
array.shape=2,3
我可以先调用 NumPy 库的array()函数来创建一维数组,然后通过改变shape属性把 一维数组转变成多维数组。比如,上段代码就是先通过array()函数创建长度为6的一维数组,然后通过改变shape属性把它变成了2X3的二 维数组。需要注意的是,修改数组的shape 属性取值,是在数组中元素不变的情况下修改数组arrayl的数据结构,数据元素值在内存中的位置并没有发生改变。 同时,我们也可以通过reshape()函数在array数组的基础上创建一个新的二维结构的数组array2。
array=np.array(range(6))

array2=array.reshape(3,2)

请注意:此处没有修改arrayl的属性值,array的shape属性值没有变。数组array和array2共用内存中的数据存储值,若更改其中任意一个数组中的元素取 值,则另一个数组相对应的元素值也会改变

2、利用arange()函数生成ndarray数组

NumPy库中的arange()函数可以通过设定起始值、结束值和步长来生成等差序列形 式的一维数组。

array=np.arange(13,1,-1)

array2=array.reshape(3,2,2)

arange()函数在创建数组序列时,不包括结束值。若想创建一个序列包含结束值,则可以使用NumPy包中linspace()函数,该函数通过设定起始值、结束值和元素的个数来 创建一维数组,可由endpoint参数来决定是否需要包含结束值,默认设定包括结束值。

array=np.linspace(1,12,12)
array2=array.reshape(3,2,2)

3、在不知道数组具体值时创建数组

如果只知道数组的大小,无法事先确定数组元素的具体值时,可以利用NumPy提供 的占位符函数来创建数组。比如,zeros()函数生成元素全部为0的数组;ones()函数生成元素全部为1的数组;empty()函数生成给定维度的、无初始值的数组,该数组的元素值由内存中原来的内容决定,并无特别的意义。在默认的情况下,生成数组的元素类型为 float64 0

array=np.zeros(100) #长度为100的一维数组
array=np.ones(100)
array=np.empty(100)

array=np.zeros((2,2,3)) #2X2X3的三维数组
array=np.ones((2,2,3))
array=np.empty((2,2,3))

二、索引与切片

我们可以根据数组中元素所在的索引值(index value)来提取单个元素或多个元素, 方法为array[start:end:step],其中start是起始索引值,end是结束索引值,step是步长值, 返回的结果是索引值为start到cnd-1之间,并且是索引值与start之差可以被step整除的 连续对象。start的默认值是0,end的默认值是数组的长度,step默认值是1。,start、 end、step三个值的取值或出现与否根据编程者需求的不同而改变。

a1=np.linspace(1,12,12)

a1
Out[6]: array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.])

a1[1]
Out[7]: 2.0

a1[1:3]
Out[8]: array([2., 3.])

a1[:5]
Out[10]: array([1., 2., 3., 4., 5.])

a1[2:]
Out[11]: array([ 3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11., 12.])

a1[-1]
Out[12]: 12.0

a1[-3]
Out[14]: 10.0

a1[:-1]
Out[15]: array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11.])

a1[:-2]
Out[16]: array([ 1.,  2.,  3.,  4.,  5.,  6.,  7.,  8.,  9., 10.])

a1[2:-1]
Out[17]: array([ 3.,  4.,  5.,  6.,  7.,  8.,  9., 10., 11.])

与序列结构数据相同,ndarray数组的索引和步长都具有正负两种取值方式,分别表示左右两个方向取值。索引的正方向从左往右 取值,起始位置为0,结束位置为len(array)-l;负方向从右往左取值,起始位置为一1,结束位置为-len(array)。

 通过索引值来提取数组中的元素或者对数组进行切片,提取的新数组与原来数组共享数据内存空间。

# al[0:3:l]中。表示起始索引值,3表示结束索引值,1表示步长
In [11]: a2=a1[0:3:1]
In [12]: a2
Out [12]: array([ 1, 2, 3])
# 将数组al中索引值为0的数据值更改为19
In [13]: al [0]=19
# 数组a2中相对应的取值也更改为19
In [14] : a2 [0]
Out [14] : 19

在NumPy的数组中,使用整型数组作为索引也可以提取数组中的元素。不过,通过整型数组作为索引提取出的数组与原数组不共享内存数据空间

# 数组[0,1,4]作为索引值
In [15]: a1[[0,1,4]]
Out [15]: array([1, 2, 5])
In [16]: a3=a1[[0,3,2]]
In [17] : a3
Out [18]: array( [19, 16, 11])
# 更改数组a1索引值为0的值为23
In [19]: a1 [0]=23
# 数蛆a3相对应的值没有发生改变,仍旧是19
In [20] : a3[0]
Out[20]: 19

上述数组元素的提取均针对一维数组,二维及其以上数组元素提取的思路与其相同,只不过要分别考虑各个维度上的索引值。

# 创建一个二维结构数组,第。轴长度为4,第1轴长度为6
na1=np.array(np.arange(24),dtype=int).reshape(4,6)

# 在第0轴上,取索引值为0,1的元素,共2行
# 在第1轴上,取索引值为1,2,3,4,5的元素,共5列
na1[:2,1:]

#在第0轴上,取到的索引值为[2,3]
#在第1轴上,取到的索引值为[2,4]
# 这样取到的两个元素分别为nal [2,2] , nal [3,4]
na1[[2,3] , [2,4]]

# 第0轴上,索引为一个范围.
# 第1轴上,索引为一个数组
na1[2:,[2,4]]
# 生成三维数组,分别有第0轴、第1轴和第2轴
na2=na1.reshape(2,3,4)

# 列表(1,1,2)的元素分别表示数值中三个维度的索引值
na2[(1,1,2)]
na2[1,1,2]

除了整型数组以外,整型列表也可以当作索引。若提取三维数组的多个值,则可以在 每一轴上分别定义一个整型数组或者整型列表作为索引值,但是三个轴上的整型数组或者 整型列表的长度要相等。


# 数组na2中三个轴上的索引取值均为整型数组
# 第。轴上的索引取值为数组[1,1,0]
# 第1轴上的索引取值为数组[0,1,2]
# 第2轴上的索引取值为数组[2,3,1]
na2[[1,1,0],[0,1,2] , [2,3,1]]

# 数组na2中三个轴上的索引取值均为整型列表
# 第0轴上的索引取值为列表(1,1,1)
# 第1抽上的索引取值为列表(0,1,2)
# 第2轴上的索引取值为列表(2,3,1)
na2[(1,1,1),(0,1,2),(2,3,1)]

na2[[1,10], [0,12], [2,3,1]]的含义是分别提取元素na2[1,0,2]、na2[l,l,3]和 na2[0,2j 所对应的值

三、数组运算

NumPy中定义了许多能够对数组中的每个元素都进行操作的ufunc (全称为universal function)函数,这些函数对于操作数组数据带来了很大的方便。

# 创建一维数组arl
In [60]: ar1=np.array(np.arange(5))
In [61] : ar1
Out [61] : array ( [0 , 1, 2, 3 , 4])

# 数组中每个元素都加4
In [61] :np.add(arl ,4)
Out [72] : array ( [4 , 5 , 6, 7, 8])
# 创建一维数组ar2

In [62]: ar2=np.array([2,3,4,5,6])

# 数组ar1和ar2相加
In [64]: arl+ar2
Out [64]: array([ 2, 4, 6, 8, 10])

#用numpy库中的add函数做数组的加法
In [65] : np.add(arl,ar2)
Out [65]: array([ 2, 4, 6, 8, 10])

如果想要将数组arl和数组ar2相加后的结果仍返回给arl,则可以将add()函数的第 三个参数取值设定为arl,如下所示:

np.add(arl,ar2 ,arl)

在NumPy库中,除了加法add()函数以外,还有其他一些数据运算函数都属于ufunc 函数,常用的数据运算函数如10.1表所示,其中a表示数组,b表示常数或者与a结构相 同的数组。如果b为常数,则a中每一个元素都和常数b做运算;如果b为与a结构相同的 数组,则a中每一个元素都与b相对应位置的元素值进行运算。最后将a与b进行运算后的返回值传给c

a = np.array( [10,20,30,50,60])
b =np.arange(5)
c = a-b #做差,注意值的个数要相同
c=b**2 # 乘方
c=10*a #10 与a的乘积
c=a<40 #如果a中的值,小于40则为True ,否则为False

c最后结果为:[ True  True  True False False]

 

结束

以上是关于Numpy - ndarray 结构的主要内容,如果未能解决你的问题,请参考以下文章

Numpy概述以及ndarray结构

Python机器学习(三十五)NumPy ndarray

Python(15):Numpy之array结构

Python3 NumPy库之ndarray数组

Python3 NumPy库之ndarray数组

Python3 NumPy库之ndarray数组