ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

NumPy

2021-09-05 01:02:28  阅读:264  来源: 互联网

标签:10 arr NumPy np array True ndarray


NumPy广泛用于科学计算,提供了ndarray(n-dimension array, n维数组)对象以及作用于ndarray上的一系列操作。通常按如下方式导入NumPy:

import numpy as np

1. 创建ndarray

ndarray有多种创建方式。可以直接通过Python的列表创建。例如:

a1 = np.array([1, 2, 3, 4, 5])  # a1是一维数组
a2 = np.array([[1, 2, 3], 
               [4, 5, 6]])  # a2是二维数组

也可以通过NumPy的内置方法创建数组,例如:

np.zeros(10)  # 大小为10的一维数组。所有元素都为0
np.ones((2,3))  # 大小为2x3的二维数组,所有元素都为1
np.full((3,4), 8.8)  # 大小为3x4的二维数组, 所有元素都为8.8
np.arange(0, 10, 2)  # 类似于Python的内置range函数, 在[0, 20)内以2为步长创建一维数组

reshape方法可以改变ndarray的形状。例如将一个包含9个元素的一维数组改变为3x3的二维数组:

arr2 = np.arange(0, 9)
""" 此时arr2为
array([0, 1, 2, 3, 4, 5, 6, 7, 8])
"""

arr2 = arr2.reshape((3,3))
""" 此时arr2为
array([[0, 1, 2],
       [3, 4, 5],
       [6, 7, 8]])
"""

 原始ndarray的大小必须与变形后的ndarray大小一致,否则会报错。如果不知道ndarray的具体大小,可以向reshape方法的其中一个维度大小传入-1,NumPy将自动完成计算。

 2. ndarray的属性

ndarray的元素具有相同的数据类型,常见的数据类型有:bool, int32, int64, uint32, uint64, float32, float64等. 创建ndarray的方法一般都提供可选参数dtype以指定元素的数据类型,默认为浮点数类型。可以通过ndrray的dtype属性得知其元素的数据类型。此外,ndarray还有如下常见属性:

# 创建一个2x3的二维数组arr, 元素的数据类型为32位整型
arr = np.array([[1, 2, 3],
                [4, 5, 6]], dtype=np.int32)

arr.dtype	# arr中元素的数据类型, 此处输出为dtype('int32')
arr.ndim	# arr的维度, arr是二维数组,故输出为2
arr.shape	# arr的形状, 此处输出为(2, 3)
arr.size	# arr的大小, 此处输出为6

 3. 索引与切片

索引和Python的列表类似,若要访问ndarray中某一元素,对于一维例如arr[0], 对于二维例如arr[0, 1], 对于三维例如arr[0, 1, 0], 以此类推,负数索引同样也可以使用。例如:

arr = np.array([[1, 2, 3],
                [4, 5, 6]], dtype=np.int32)

arr[0, 1]	# 第0行第1列, 值为2
arr[1, -1]	# 访问第1行最后一个元素, 值为6

 对于ndarray的切片操作,每个维度可通过start:stop:step访问,默认start=0, stop=所在维度的大小,step=1. 对于一维有arr[start:end:stop], 对于二维有arr[start:end:stop, start:end:stop], 以此类推。例如:

arr3 = np.arange(0, 12).reshape((3,4))
"""
array([[ 0,  1,  2,  3],
       [ 4,  5,  6,  7],
       [ 8,  9, 10, 11]])
"""

arr3[0:2, 1:3]	# 取arr3的第0,1行, 第1,2列
"""
array([[1, 2],
       [5, 6]])
"""

arr3[1, :]	# 第1行, 可简写为arr3[1]. 输出为array([4, 5, 6, 7])
arr3[:, 1]  # 第1列, 输出为array([1, 5, 9])
arr3[1, ::-1]	# 取arr3的第一行,并逆序, 输出为array([7, 6, 5, 4])

arr3[::-1, ::-1]  # 先对行逆序, 再对列逆序
"""
array([[11, 10,  9,  8],
       [ 7,  6,  5,  4],
       [ 3,  2,  1,  0]])
"""

 需要注意的是,ndarray的切片操作返回的结果称为原ndarray数据的一个视图,而不是原数据的副本。也就是说,对切片元素的修改会导致原ndarray相应数据的修改。例如:

arr4 = np.arange(0, 10, 2)  # arr4为array([0, 2, 4, 6, 8])
arr5 = arr4[:3]  # arr5为array([0, 2, 4])
arr5[1] = 100
"""
执行上述操作后,
arr5 = array([  0, 100,   4])
arr4 = array([  0, 100,   4,   6,   8])
"""

 返回视图而不是原数据的副本可以减少大型ndarray的复制操作所带来的巨大开销。如果确实需要复制ndarray, 通过调用arr.copy()得到arr的一个副本。

 4. 数学函数

NumPy中定义了一系列数学运算和数学函数操作,例如:

  • 重载操作符的运算:加、减、乘、除、幂、取模、取整、取绝对值等,这些操作也可以通过NumPy的内置函数使用,例如np.add, np.multiply, np.power.
  • 三角函数与反三角函数。例如np.sin, np.cos, np.tan, np.arcsin, np.arccos, np.arctan.
  • 指数与对数函数。例如np.exp, np.exp2, np.power(10, x), np.log, np.log2, np.log10.

5. 统计函数

NumPy还有一些用于计算带有统计属性的函数,例如:

  • 求和、求积:np.sum, np.prod.
  • 最大值、最小值、中位数:np.max, np.min, np.median.
  • 最大值的索引、最小值的索引:np.argmax, np.argmin.(返回一个整数,相对起始元素的下标,而不是表示其位置的元组)
  • 任一、所有:np.any, np.all.
  • 均值、标准差、方差:np.mean, np.std, np.var.
  • 百分位数:np.percentile. 例如,若np.percentile(arr, 75)的返回值为3, 则说明arr中75%的数据都不大于3. 

上述操作可以指定可选参数axis指定沿着哪个轴操作。这些操作也可以直接通过ndarray访问, 例如arr.sum().

 6. 比较

比较操作符得到一个同等大小的ndarray, 元素类型为bool. 例如:

arr = np.arange(10, 50, 2).reshape(4,5)
"""
array([[10, 12, 14, 16, 18],
       [20, 22, 24, 26, 28],
       [30, 32, 34, 36, 38],
       [40, 42, 44, 46, 48]])
"""

arr < 36
"""
array([[ True,  True,  True,  True,  True],
       [ True,  True,  True,  True,  True],
       [ True,  True,  True, False, False],
       [False, False, False, False, False]])
"""

 可利用上述统计函数对返回的布尔类型的ndarray操作。此外,还可以利用此ndarray选择特定元素。例如:

arr = np.arange(10, 50, 2).reshape(4,5)
arr[ arr % 4 == 0 ]  # 选择
# array([12, 16, 20, 24, 28, 32, 36, 40, 44, 48]), 这里得到的是一维ndarray,
   

标签:10,arr,NumPy,np,array,True,ndarray
来源: https://www.cnblogs.com/exploreTheUnknown/p/15228432.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有