numpy(一)——数组的创建
import numpy as np
numpy数组对象的创建
ndarray数组是numpy中的基本数据结构,要创建一个ndarray对象,可以有以下几种方法:
arr_list = np.array([1,2,3,4,5])
arr_list
array([1, 2, 3, 4, 5])
arr_tuple = np.array((1,2,3,4,5))
arr_tuple
array([1, 2, 3, 4, 5])
如果传入n(n>=2)维的列表(或者元组,但仅以列表为例展示,在创建ndarray对象上,列表和元组地位相等),则会生成一个n维的ndarray对象
arr_nd = np.array([[1,2,3],
[2,3,4]])
arr_nd
array([[1, 2, 3],
[2, 3, 4]])
arr_arr = np.array(arr_list)
arr_arr
array([1, 2, 3, 4, 5])
arr_ones = np.ones((3,4)) #c创建一个形状为3x4的元素全为(浮点类型)1的ndarray对象。传入的元组就是你需要生成的ndarray对象的形状。
#关于ndarray对象的形状,后有详述。
arr_ones
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
arr_zeros = np.zeros((3,4))
arr_zeros
array([[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.],
[ 0., 0., 0., 0.]])
arr_zeros_1d = np.zeros(10) #当传入一个参数而非元组时,则生成一个1维的ndarray的对象
arr_zeros_1d
array([ 0., 0., 0., 0., 0., 0., 0., 0., 0., 0.])
arr_emp = np.empty((3,4)) #根据给定形状生成一个没有初始化值的ndarray对象(没有初始化值可以理解为是生成内存中的垃圾值,而非不生成值)
arr_emp
array([[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.],
[ 1., 1., 1., 1.]])
arr_full = np.full((3,4),5) #根据给定形状和给定值生成一个ndarray数组
arr_full
array([[5, 5, 5, 5],
[5, 5, 5, 5],
[5, 5, 5, 5]])
arr_e = np.eye(3) #生成一个单位矩阵(对角线全为1,其余元素全为0)
arr_e
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
arr_identity = np.identity(3) #和np.eye方法等价
arr_identity
array([[ 1., 0., 0.],
[ 0., 1., 0.],
[ 0., 0., 1.]])
arr_test = np.arange(15).reshape(3,5) #arange和reshape是什么稍候再说,这里只需知道,我们生成了一个3x5的ndarray对象即可
arr_test
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr_ones_like = np.ones_like(arr_test) #根据所给的数组生成一个形状一样的全1数组。简言之,取其形而不留其值。
#这种方法其实全完等价于np.ones(arr_test.shape)
arr_ones_like
array([[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1],
[1, 1, 1, 1, 1]])
书不能悉意,故仅以np.ones_like做展示之用,除此之外,还有相对应的np.zeros_like,np.empty_like,np.full_like方法。用法完全相同,详见《利用Python进行数据分析 第二版》P92
np.arange是Python中range的numpy版本,可以从arange方法生成数组对象
arr_arng = np.arange(15)
arr_arng
array([ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14])
arange方法经常与reshape方法连用,以改变创建出来的数组的形状(这里再次提到了形状这个词,请稍等等,马上就讲)
arr_arng_shp = np.arange(15).reshape(3,5) #将数组的形状由上例中的1*15改变为3*5
arr_arng_shp
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
reshape与resize的区别
在numpy中,另有一个与reshape作用相同且用法一致的方法,就是resize,该方法也是用于改变数组形状。
区别在于:reshape方法作用之后返回的是原数组的副本,而resize则是对原数组进行原地变形操作
arr_test
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr_test_reshape = arr_test.reshape(5,3)
arr_test_reshape
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
你会发现,arr_test的形状并没有变,仍旧是3x5
arr_test
array([[ 0, 1, 2, 3, 4],
[ 5, 6, 7, 8, 9],
[10, 11, 12, 13, 14]])
arr_test_resize没有任何返回值,这就说明,arr_test是在原地别修改了,因此才没有任何返回值
arr_test_resize = arr_test.resize(5,3)
arr_test_resize
一看,果然如此,arr_test的形状变为了5x3。详见《Python数据科学手册》P41(我的pdf版本)
arr_test
array([[ 0, 1, 2],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
那么,reshape方法返回的到底是原数组的副本呢,还是视图呢?
arr_test_reshape[0] = 1 #先将arr_test_reshape的第一行改成1
arr_test_reshape
array([[ 1, 1, 1],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
arr_test #打印arr_test,查看其前三个数据,看其值是否改变
array([[ 1, 1, 1],
[ 3, 4, 5],
[ 6, 7, 8],
[ 9, 10, 11],
[12, 13, 14]])
可以发现:arr_test第一行的值变为了1,说明reshape方法返回的其实是原数组的一个视图而不是真正的副本。参见《Python数据科学手册》P41