《利用python进行数据分析》读书笔记之Numpy基础(一)


首先介绍ndarray对象的两个属性,分别是dtype和shape,分别是ndarray的数据类型和形状描述

import numpy as np
#生成一个两行三列的随机矩阵
arr = np.random.rand(2,3)
print(arr.dtype)
#float64
print(arr.shape)
#(2, 3)

常用的ndarray对象生成方法

首先可以使用np中的array方法:

arr1 = np.array([1.2,2,3,5])
#生成一个一维矩阵
print(arr1)
#[1.2 2.  3.  5. ]
print(arr1.dtype)
#float64
arr2 = np.array([[1,2,3,4],[2,2,3,4]])
#生成一个二维矩阵
print(arr2)
#[[1 2 3 4]
 #[2 2 3 4]]
print(arr2.dtype)
#int32

这里除非显式指定,否则np.array会自动根据列表中的元素决定ndarray的数据类型。
还可以使用np.ones和np.zeros创建全零或者全1的矩阵:

arr3 = np.ones(10)
#创建一个一行十列的全1矩阵
arr4 = np.zeros((2,3))
#创建一个两行三列的全0矩阵

注意,当使用ones和zeros创建高阶矩阵的时候应该使用元组的形式。除非显式指定,数据类型默认为float64。

ndarray的数据类型

在创建ndarray对象时我们可以显式的指定其数据类型:

arr5 = np.array([1,2,3],dtype=np.float32)
print(arr5.dtype)
#float32

具体的数据类型可以参考:
numpy数据类型
可以使用astype显式的改变矩阵的数据类型:

arr6 = arr5.astype(np.int32)
#将arr5的数据类型变为int32并赋值给arr6
print(arr6.dtype)
#int32
print(arr5.dtype)
#float32

注意这里并不会改变arr5的数据类型,另外如果将浮点数换为整数,贼小数点后的数据都会消失。
也可以使用astype将表示数字含义的字符串转换为数字:

arr8 = np.array(['1.25','3.2','-7'],dtype=np.string_)
arr9 = arr8.astype(np.float64)
print(arr9)
#[ 1.25  3.2  -7.  ]
print(arr9.dtype)
#float64

numpy数组算数

ndarray允许进行批量操作而无需for循环,两个尺寸相同的ndarray对象之间的运算都采用了逐元素运算的方式:

arr1 = np.array([[1,3,5],[2,4,6]])
arr2 = np.array([[2,4,6],[3,5,7]])
print(arr1+arr2)
#[[ 3  7 11]
 #[ 5  9 13]]
print(arr1*arr2)
#[[ 2 12 30]
 #[ 6 20 42]]
print(arr1>arr2)
#[[False False False]
 #[False False False]]

带有标量的算术操作,会把计算参数传递给矩阵中的每一个元素:

print(arr1*2)
#[[ 2  6 10]
 #[ 4  8 12]]

基础索引与切片

一维数组的切片

arr = np.arange(10)
print(arr)
#[0 1 2 3 4 5 6 7 8 9]
print(arr[5:8])
#[5 6 7]
#切片:从索引为5(从0开始)到索引为8之前的元素,即要头不要尾
arr[5:8] = 12
print(arr)
#[ 0  1  2  3  4 12 12 12  8  9]

*这里我们注意到,任何对切片的修改都会改变原矩阵的元素值,因为我们得到的是原数组的一个视图而不是一份拷贝。*再举一个例子:

arr = np.arange(10)
arr_slice = arr[5:8]
arr_slice[0] = 200
print(arr_slice)
#[200   6   7]
print(arr)
#[  0   1   2   3   4 200   6   7   8   9]

如果我们想要得到原数组的一份拷贝而不是视图的话,我们需要显示的复制这个数组。

arr_slice = arr[5:8].copy()

对于高维数组,每个元素不再是一个值而是一个一维数组:

arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr[2])
#[7 8 9] 即数组的第二行
#我们可以通过以下两种方式访问高维数组中的元素
print(arr[2][0])
print(arr[2,0])
#均打印出7,可以理解为第2行第0列

二维数组的切片

arr = np.array([[1,2,3],[4,5,6],[7,8,9]])
print(arr[:2])
#[[1 2 3]
 #[4 5 6]]
#相当于将arr看作一个一维数组。:2表示索引为2之前的所有行
print(arr[:2,1:])
#[[2 3]
 #[5 6]]
#1:表示从索引1开始,到之后的所有列

也可以进行混合使用,如只取第0行的0列和1列

print(arr[0,0:2])
print(arr[0,:2])
#均输出[1 2]

与一维数组的切片一样,当切片被修改后,原数组也会被修改。

布尔索引

可以使用bool值来访问数组:

arr = np.random.randn(4,4)
print(arr)
#生成一个4#4的随机数组
print(arr[np.array([True,True,False,False])])
#打印前两行
arr[arr<0] = 0
#先切片,得到数组中小于0的值,之后将其变为0
发布了14 篇原创文章 · 获赞 0 · 访问量 239

猜你喜欢

转载自blog.csdn.net/pnd237/article/details/104221862