numpy(一)——数组的创建

numpy(一)——数组的创建

import numpy as np

numpy数组对象的创建

ndarray数组是numpy中的基本数据结构,要创建一个ndarray对象,可以有以下几种方法:

  • 从python列表和元组进行创建

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]])
  • 从另一个ndarray对象进行创建

arr_arr = np.array(arr_list)
arr_arr
array([1, 2, 3, 4, 5])
  • 从numpy方法创建

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生成

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值