NumPy学习(1、多维数组对象)

import numpy as np

#1.1、NumPy ndarray
data = np.random.randn(2, 3) #创建一个2行3列的随机数组
print(data.shape) #返回数组的属性,这里是(2, 3)
print(data.dtype) #返回数组内元素的数据类型,这里是float64

#1.2、生成ndarray
data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1) #把列表转化为NumPy数组

data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr2 = np.array(data2) #同等长度的列表,会自动转化成多维数组
print(arr2.ndim) #返回数组的行

print(np.zeros(10)) #创建一个包含10个0的数组(向量)
print(np.zeros((3, 6))) #创建一个3行6列的元素都是0的数组,注:创建高维数组需要为shape传递一个元组
print(np.ones((2, 4))) #创建一个2行4列的元素都是1的数组
print(np.empty((2, 3, 4))) #创建一个没有初始化数值的数组
print(np.arange(10)) #创建一个0到9的数组(向量)
print(np.full((3, 4), 3)) #创建一个3行4列的数组,里面的元素都是3
print(np.eye(3, 4)) #创建一个从左上到右下对角线是1的数组(3, 4),其余元素都是0
print(np.identity(4)) #创建一个标准矩阵(4, 4),对角线是1,其余是0

#1.3、ndarray的数据类型
arr1 = np.array([1, 2, 3], dtype=np.float64)
arr2 = np.array([1, 2, 3], dtype=np.int32)
print(arr1.dtype, arr2.dtype) #可以通过 dtype= 参数来改变数据类型

arr3 = arr1.astype(np.int32)
print(arr3.dtype) #也可以通过astype直接改变数据类型(注:astype总是生成一个新的数组)

arr4 = np.array(['1.2', '2.3', '3.4'], dtype=np.str)
arr5 = arr4.astype(np.float)
print(arr5) #把字符串类型的数组元素转变成float(注:如果这里直接转变为int会报错!)

#1.4、NumPy数组算术
arr = np.array([[1, 2, 3], [4, 5, 6]])
print(arr * arr) #返回[[1, 4, 9], [16, 25, 36]]
print(arr**0.5) #返回[[1, 1.414, 1.732], [2, 2.236, 2.449]]
arr2 = np.array([[2, 1, 3], [5, 6, 4]])
print(arr >= arr2) #返回[[False, True, True], [False, False, True]]

#1.5基础索引与切片
list1 = [x for x in range(10)]
list1[5:8] = (1, 1, 1)
print(list1) #list的元素替换
arr1 = np.arange(10)
arr1[5:8] = 1
print(arr1) #Numpy的元素替换

arr = np.array([[0, 1, 2], [3, 4, 5], [6, 7, 8]])
print(arr[1, 2]) #返回5

#1.5.1数组的切片索引
arr1 = np.array([0, 1, 2, 3, 4, 64, 64, 64, 8, 9])
print(arr1[1:6]) #输出[1 2 3 4 64]

arr2d = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr2d[:2]) #输出[[1,2,3],[4,5,6]]
print(arr2d[:2, 1:]) #输出[[2,3], [5,6]]
print(arr2d[1, :2]) #输出[4, 5]
print(arr2d[:2, 2]) #输出[3, 6]
print(arr2d[:, :1]) #输出[[1], [4], [7]]
arr2d[:2, 1:] = 0
print(arr2d) #输出[[1, 0, 0], [4, 0, 0], [7, 8, 9]]

#1.6 布尔索引
names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.array([[0, 0], [1, 1], [2, 2], [3, 3], [4, 4], [5, 5], [6, 6]])
print(names == 'Bob') #输出[True, False, False, True, False, False, False]
print(data[names == 'Bob', :1]) #输出名字是Bob的行的names行数值,且只要第1列,结果:[[0], [3]]
print(data[~(names == 'Bob')]) #输出名字不是Bob的行的names行数值,结果:[[1, 1], [2, 2], [4, 4], [5, 5], [6, 6]]
print(data[(names != 'Bob')]) #同上
print(data[(names == 'Bob') | (names == 'Will')]) #输出名字是Bob或Will的行的names行数值,结果:[[0, 0], [2, 2], [3, 3], [4, 4]]
data[data < 3] = 4
print(data) #输出 [[4, 4], [4, 4], [4, 4], [4, 4], [4, 4], [5, 5], [6, 6]]

#1.7 神奇索引(使用整数数组进行数据索引)
arr = np.empty((8, 4))
for i in range(8):
    arr[i] = i
print(arr) #输出[[0. 0. 0. 0.],[1. 1. 1. 1.],[2. 2. 2. 2.],[3. 3. 3. 3.],[4. 4. 4. 4.],[5. 5. 5. 5.],[6. 6. 6. 6.],[7. 7. 7. 7.]]
print(arr[[4, 3, 0, 6]]) #输出[[4. 4. 4. 4.], [3. 3. 3. 3.], [0. 0. 0. 0.],[6. 6. 6. 6.]]
print(arr[[-3, -5, -7]]) #输出[[5. 5. 5. 5.],[3. 3. 3. 3.],[1. 1. 1. 1.]]

arr = np.arange(32).reshape((8, 4))
print(arr) #[[ 0  1  2  3],[ 4  5  6  7],[ 8  9 10 11],[12 13 14 15],[16 17 18 19],[20 21 22 23],[24 25 26 27],[28 29 30 31]]
print(arr[[1, 5, 7, 2], [0, 3, 1, 2]]) #输出[ 4 23 29 10]
print(arr[[1, 5, 7, 2]][:, [0, 3, 1, 2]]) #输出[[ 4  7  5  6],[20 23 21 22],[28 31 29 30],[ 8 11  9 10]]

# 1.8数组转置和换轴
# 转置是一种特殊的数据重组形式,可以返回底层数据的视图而不需要复制任何内容,数组拥有transpose方法,也有特殊的T属性:
arr = np.arange(15).reshape((3, 5))
print(arr.T) #输出[[ 0  5 10],[ 1  6 11],[ 2  7 12],[ 3  8 13],[ 4  9 14]]

arr = np.arange(1, 7).reshape(2, 3)
print(arr) #输出[[1, 2, 3], [4, 5, 6]]
print(arr.T) #输出[[1, 4], [2, 5], [3, 6]]
print(np.dot(arr.T, arr)) #输出 [[17 22 27],[22 29 36],[27 36 45]]
   # [[1, 4],        [[1, 2, 3]         [[17, 22, 27],
   #   2, 5],   X      4, 5, 6]] ==>     [22, 29, 36]
   #   3, 6]]                            [27, 36, 45]

# 对于更高维度的数组,transpose方法可以接收包含轴编号的元组,用于置换轴:
arr = np.arange(16).reshape((2, 2, 4))
print(arr)
# 输出:
# [[[ 0  1  2  3]
#   [ 4  5  6  7]]
#  [[ 8  9 10 11]
#   [12 13 14 15]]]
print(arr.transpose((1, 0, 2)))
# 输出:
# [[[ 0  1  2  3]
#   [ 8  9 10 11]]
#  [[ 4  5  6  7]
#   [12 13 14 15]]]

# swapaxes方法接收一对轴编号作为参数,并对轴进行调整用于重组数据(返回的是数据的视图,没有对数据进行复制):
print(arr.swapaxes(1, 2))
# 输出:
# [[[ 0  4]
#   [ 1  5]
#   [ 2  6]
#   [ 3  7]]
#  [[ 8 12]
#   [ 9 13]
#   [10 14]
#   [11 15]]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值