python的数组属性_Numpy数组的创建及其属性

在《Python Numpy基础:多维数组ndarray对象》我们对 ndarray 数组对象有了基本的认识,ndarray 数组由数据本身以及描述性元数据构成,且分开存放,从而减少对数据本身的访问频率,进而优化了效率,ndarray 数组,也可以称为 Numpy 数组,该数组所有的数据类型必相同,即具有同质性;且数组的下标也是从 0 开始的。

在上一节中大多数情况下是生成的是随机数组但是这与我们的主观能动性不符,那么如何创建一个 Numpy 数组呢,在本节我们将介绍几种创建数组的方法。

1. Numpy 数组的创建方法

1)np.array()

这是最基本的数组构建方法, 它的完整方法如下所示:

numpy.array(object, dtype=None, copy=True, order='K', subok=False, ndmin=0)

对于上面的参数,我们简单做一下解释,因为某些参数几乎用不到,所以我们只需记住常用的重要参数即可:

object,表示数组,即要生成 ndarray 数组的对象;

dtype,表示数据类型,根据给出的object自动确定;

copy,布尔值,为 True 表示复制对象;

order,指定内存布局,有 K、A、C、F 可选,默认即可;

subok,布尔值,创建的数组是否作为基类数组;

ndmin,指定数组具有的最小维数。

示例如下所示:

In [1]: import numpy as np

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

In [3]: data

Out[3]:

array([[1, 2],

[3, 4]])

In [4]: data=np.array([1,2,3,4],dtype=complex)#复数类型

In [5]: data

Out[5]: array([1.+0.j, 2.+0.j, 3.+0.j, 4.+0.j])

In [6]: data=np.array([1,2,3,4],ndmin=2)#二维数组

In [7]: data

Out[7]: array([[1, 2, 3, 4]])

2) np.arange(start,stop,step,dtype=None)

这个创建数组的方式也很容易理解,因为它和 Python 的内置函数的 range 函数是一样的,在以后我们会经常使用的到这个方法:

In [8]: data=np.arange(1,5,1)

In [9]: data

Out[9]: array([1, 2, 3, 4])

通过调用 ndarray 数组的属性 reshape 可以改变数组的维度。

3) np.zeros(shape,dtype,order="C")与np.zeros_like()

这两种方法都可以创建全 0 数组,只不过后者可以参考某个 ndarry 数组的维度来创建全 0 数组,提供的参数含义如下所示:

shape:数组形状

dtype:数据类型

order: 表示数组在内存的存放次序是以行“C”为主,还是以列“F”为主,“A” 表示以列为主储存,一般默认即可。

示例如下:

In [1]: import numpy as np

In [2]: data=np.zeros(8)#一维数组含有8个元素

In [3]: data

Out[3]: array([0., 0., 0., 0., 0., 0., 0., 0.])

In [4]: data=np.zeros((3,3))#3*3的二维矩阵

In [5]: data

Out[5]:

array([[0., 0., 0.],

[0., 0., 0.],

[0., 0., 0.]])

In [6]: data1=np.zeros_like(data)#按照data的维度生成数组

In [7]: data1

Out[7]:

array([[0., 0., 0.],

[0., 0., 0.],

[0., 0., 0.]])

你可能会有疑问,这种创建数组的方式有什么作用呢?其实它的作用还是挺重要的,它的应用场景就是掩码操作,即 0 代表 False 而  1 代表 True,这在后面会给大家进行介绍。

4) np.ones(shape,dtype,order)与np.ones_like()

这两个方法和上面的 zeros 方法很相似,只不过它生成的是全 1 数组,又称为单位矩阵,如下所示:

In [8]: data=np.ones(6)

In [9]: data

Out[9]: array([1., 1., 1., 1., 1., 1.])

In [10]: data=np.ones((2,4))

In [11]: data

Out[11]:

array([[1., 1., 1., 1.],

[1., 1., 1., 1.]])

In [12]: data1=np.ones_like(data)

In [13]: data1

Out[13]:

array([[1., 1., 1., 1.],

[1., 1., 1., 1.]])

5) np.empty(shape,dtype,order)与np.empty_like()

用于创建空数组,只不过它不是真“空”,它会提供未初始化的随机值,如果想创建高维数组则需要 shape 传递一个元组,示例如下所示:

In [1]: import numpy as np

In [2]: data=np.empty(5)

In [3]: data

Out[3]:

array([0.00000000e+000, 0.00000000e+000, 0.00000000e+000, 6.36356552e-321,

2.64522281e+185])

In [4]: data=np.empty(shape=(3,3))

In [5]: data

Out[5]:

array([[6.23042070e-307, 1.42417221e-306, 1.37961641e-306],

[2.22522597e-306, 1.33511969e-306, 1.24610383e-306],

[1.51317517e-306, 9.34610469e-307, 2.56765117e-312]])

其中 e 是数学中一个超越数,是一个无限不循环小数。

6) np.eys()

np.eys() 函数定义如下所示,它可以用来创建对角矩阵数组,即 N*N 的二维矩阵,对角线为 1,其余为 0:

numpy.eye(N,M=None,k=0,dtype=None,order='C)

N: int 型,表示的是输出的行数。

M:int 型,可选项,输出的列数,如果没有就默认为 N。

k:int 型,可选项,对角线的下标,默认为0表示的是主对角线,负数表示的是低对角,正数表示的是高对角。

dtype:数据的类型,可选项,返回的数据的数据类型。

order:{'C','F'},可选项,也就是输出的数组的形式是按照C语言的行优先 'C',还是按照 Fortran 形式的列优先 'F' 存储在内存中。

In [13]: data=np.eye(5)#5*5矩阵

In [14]: data

Out[14]:

array([[1., 0., 0., 0., 0.],

[0., 1., 0., 0., 0.],

[0., 0., 1., 0., 0.],

[0., 0., 0., 1., 0.],

[0., 0., 0., 0., 1.]])

In [15]: data=np.eye(4)#4*4矩阵

In [16]: data

Out[16]:

array([[1., 0., 0., 0.],

[0., 1., 0., 0.],

[0., 0., 1., 0.],

[0., 0., 0., 1.]])

7) np.linspace()

生成指定范围内指定个数的一维数组,生成是一个等差数列,该方法的定义如下所示:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

对该方法的参数解释如下所示:

在指定的间隔 ["start","stop"] 内均匀地返回数字。返回“num”个等间距的样本。

endpoint 是一个 bool 类型的值,如果为 "Ture",“stop"是最后一个值,如果为"False",生成的数组不会包含 "stop" 值

retstep 也是一个 bool 类型的值,如果为"Ture",会返回样本之间的间隙。

在正态分布的数据关系中,该方法的使用频率很高,示例如下所示:

In [15]: data=np.linspace(2,6,num=10)

In [16]: data

Out[16]:

array([2. , 2.44444444, 2.88888889, 3.33333333, 3.77777778,

4.22222222, 4.66666667, 5.11111111, 5.55555556, 6. ])

In [17]: data=np.linspace(2,3,num=10)

In [18]: data

Out[18]:

array([2. , 2.11111111, 2.22222222, 2.33333333, 2.44444444,

2.55555556, 2.66666667, 2.77777778, 2.88888889, 3. ])

2. ndarray数组对象的属性

下面我们介绍 ndarray 数组的常用属性,其实在我们在前面知识介绍中已经涉及了一些,现在我们系统进行讲解,这里我们要理解几个专业名词,即维度、轴、秩,Numpy 中维度(dimensions)也称为轴(axis),而轴的个数称为秩。这些名词简单知道即可,不必深究。NumPy 的数组中有很多的属性,有一些属性可能在实例的工作中,可能万年不遇,所以我们只做针对性的介绍:

ndarray.ndim,获取数组的维数;

ndarray.shape,获取数组的维度;

ndarray.size,获取元素的个数;

ndarray.dtype,元素的数据类型;

ndarray.itemsize,每个元素的字节大小;

ndarray.T,获取数组对象转置数组;

ndarray.nbytes,总字节数;

ndarray.real,获取复数分实部;

ndarray.imag ,获取复数的虚部;

ndarray.data,包含实际数组元素的缓冲区;

ndarray.flags,返回数组对象内部信息;

ndarray.base,若一个数组存在基类数组,用base可获取基类数组。

对于上面属性,我们只演示重要的一部分属性,大家可以自己尝试其他的属性,对于涉及到复数概念不清楚的,可以自行百度搜索,后面知识还会涉及到标量与向量的概念,所以大家要学会自学,这些简单的数学概念不会在教程中讲解。对象属性的操作示例如下:

In [1]: import numpy as np

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

#获取维度

In [3]: data.shape

Out[3]: (2, 3)

#获取维数

In [4]: data.ndim

Out[4]: 2

#获取元素数据类型

In [5]: data.dtype

Out[5]: dtype('int32')

In [6]: data.size

Out[6]: 6

#每个元组字节大小

In [7]: data.itemsize

Out[7]: 4

#获取对象内存信息

In [8]: data.flags

Out[8]:

C_CONTIGUOUS : True # 数组位于单一的、C 风格的连续区段内

F_CONTIGUOUS : False #数组位于单一的、Fortran 风格的连续区段内

OWNDATA : True #数组的内存从其它对象处借用

WRITEABLE : True #数据区域可写入。 将它设置为False会锁定数据,使其只读

ALIGNED : True #数据和任何元素会为硬件适当对齐

WRITEBACKIFCOPY : False #

UPDATEIFCOPY : False #这个数组是另一数组的副本。当这个数组释放时,源数组会由这个数组中的元素更新

#获取转置数组

In [9]: data.T

Out[9]:

array([[1, 4],

[2, 5],

[3, 6]])

对于上面的常用属性大家要重点掌握,Numpy 数组的创建方法,也不止于此,我们还可以使用 np.logspace() 创建等比数组以及 np.full() 构造一个数组,用指定值填充其元素,对于本节知识大家也要重点掌握,作为 Numpy 的基础,尤为重要。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
numpy数组元素周围的操作可以通过以下几种方式实现: 1. 切片操作:可以使用numpy数组的切片操作来获取数组中元素的周围元素。 例如,对于一个二维数组arr,要获取第i行第j列元素周围的元素,可以使用如下切片操作: ```python arr[i-1:i+2, j-1:j+2] ``` 这将返回一个3x3的子数组,其中心元素为arr[i,j],周围的8个元素为该子数组的其余元素。 2. 使用numpy.pad()函数:numpy.pad()函数可以用来在数组的边缘添加一个或多个值,从而扩展数组的大小。可以使用该函数来添加额外的行和列,然后通过索引访问周围的元素。 例如,对于一个二维数组arr,要获取第i行第j列元素周围的元素,可以使用如下代码: ```python padded_arr = np.pad(arr, ((1, 1), (1, 1)), mode='constant') surrounding = padded_arr[i:i+3, j:j+3] ``` 这将在数组的边缘添加一行和一列,并使用常量值填充这些额外的元素。然后可以使用切片操作来获取中心元素周围的元素。 3. 使用numpy.roll()函数:numpy.roll()函数可以用来沿着给定轴滚动数组的元素。可以使用该函数来将数组的行和列进行滚动,从而获取周围的元素。 例如,对于一个二维数组arr,要获取第i行第j列元素周围的元素,可以使用如下代码: ```python rows, cols = arr.shape row_indices = np.arange(i-1, i+2) % rows col_indices = np.arange(j-1, j+2) % cols surrounding = arr[row_indices][:, col_indices] ``` 这将将第i行向上和向下滚动一行,并将第j列向左和向右滚动一列,从而获取中心元素周围的元素。使用模运算可以确保在数组的边缘滚动时正确处理索引。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值