数据挖掘Python基础之NumPy基础(上)

Python NumPy:入门与ndarray操作详解

前言

时隔两个月,我又回来了,期间发生了很多很多的事情,也曾对自己产生了怀疑,对自己的坚持产生了怀疑。不过在颓废之后总是奋进,而生活也要继续,只能以“雄关漫道真如铁,而今迈步从头越”来自勉了。正好回家居家隔离,我要立一个flag日更。。。

之前我们已经学习了Python的一些语法基础,包括Pyhton的基础数据结构,函数与文件读写以及Pyhton面向对象的内容。接下来我们将面向数据挖掘学习一些常用的包,其中NumPy是最为重要的数值计算的 基础包。

ndarray

ndarray是一种高效多维数组,提供了基于数组的便捷算术操作以及灵活的广播功能,如下我们可以快速生成一个2*3的数组。

import numpy as np


data = np.random.randn(2, 3)
print(data)

其结果为

[[ 0.52828809  0.75873811 -0.81223681]
 [ 2.13722235  0.40123476 -0.07276397]]

通过以上方法我们很简单就生成了2x3的数组,其实ndarray就是一个通用的多维数组容器,它包含的元素都是同一类型的,我们可以通过它的shape属性来查看数组的维数,通过dtype属性来查看它的数据类型。例子如下

import numpy as np

data = np.random.randn(2, 3)
print(data.shape)
print(data.dtype)

其结果如下

(2, 3)
float64

生成ndarray

生成ndarray最简单的方法就是array函数,array函数接受任意的序列型对象,生成一个新的包含传递数据的NumPy数组。例子如下:

import numpy as np

data1 = [1, 2, 3, 4]
data2 = [[1, 2, 3, 4], [5, 6, 7, 8]]
arr1 = np.array(data1)
arr2 = np.array(data2)
arr1 = arr1 * 10
arr2 = arr2 + arr1
print(arr1)
print(arr2)

其结果如下

[10 20 30 40]
[[11 22 33 44]
 [15 26 37 48]]

我们可以看到array函数将数组转化成为了ndarray,同时也看到了ndarray对于数组运算的简化,省去了大量的for循环。

我们还可以通过zeros创造全0数组,ones来创建全1数组以及通过empty来创建没有初始化值的数组。代码如下

import numpy as np

arr1 = np.zeros(10)
arr2 = np.zeros((5, 2))
print(arr1)
print(arr2)

其结果如下

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[[0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]
 [0. 0.]]

当我们使用empty来创建数组时需要注意,有时候会返回未初始化的垃圾数值。

代码如下

import numpy as np

arr1 = np.empty(10)
arr2 = np.empty((5, 2))
print(arr1)
print(arr2)

结果如下

[0. 0. 0. 0. 0. 0. 0. 0. 0. 0.]
[[6.95006917e-310 1.29189234e-316]
 [5.39246171e-317 5.39246171e-317]
 [6.95006798e-310 6.95006795e-310]
 [5.39246171e-317 5.39246171e-317]
 [5.39247752e-317 6.95006795e-310]]

索引基础和切片

一维数组的索引和切片比较简单,和Python的列表的切片很类似。
代码如下

import numpy as np

arr1 = np.arange(10)
arr2 = arr1[5:8]
print(arr1)
print(arr2)

需要注意的是对于数组的切片是原数组的视图,这意味着数据并没有被复制,任何对于视图的修改都会反映到原数组上,其原因是ndarray是用来处理大规模数组的,所以可以想象对于数组的复制的开销会很大。

代码如下

import numpy as np

arr1 = np.arange(10)
arr1[5:8] = 12
print(arr1)

结果如下

[ 0  1  2  3  4 12 12 12  8  9]

多维数组的切片索引和单维数组的切片索引原理是一样的,只不过单维数组的切片的元素是数字,而多维数组切片的元素是单维数组或者多维数组。

代码如下

import numpy as np

arr1 = np.random.randn(3, 3)
print(arr1)
print(arr1[:2])

结果如下

[[ 0.60673463 -0.84261761 -0.55674384]
 [ 1.49376061 -1.23850612 -0.10686775]
 [ 1.3516511  -0.65024839 -1.68451601]]
 
[[ 0.60673463 -0.84261761 -0.55674384]
 [ 1.49376061 -1.23850612 -0.10686775]]

我们可以把[ 0.60673463 -0.84261761 -0.55674384] [ 1.49376061 -1.23850612 -0.10686775]
[ 1.3516511 -0.65024839 -1.68451601] 看作三个元素,而arr1[:2]就是取前两个元素。

对于多维数组我们还可以进行多组切片

代码如下

import numpy as np

arr1 = np.random.randn(3, 3)
print(arr1)
print(arr1[1:, :2])

结果如下

[[ 1.51132511 -0.16890946 -0.78987301]
 [ 0.41426026 -0.09105493  1.44744887]
 [ 1.79046674  0.27690028  1.31201169]]
 
[[ 0.41426026 -0.09105493]
 [ 1.79046674  0.27690028]]

在数组的切片中我们还可以传入布尔值,实现更加灵活的操作,其中布尔数组的长度必须和数组轴索引长度一致。

代码如下

import numpy as np

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
print(names == 'Bob')
print(data[names == 'Bob'])

结果如下

[ True False False  True False False False]

[[ 1.20875931  0.54870492 -0.45572233 -0.58897014]
 [-1.42004058 -0.81150623  1.03740228  0.91427144]]

从以上结果我们可以看出,数组索引传入布尔值就是返回为true的行。

我们也可以通过传入布尔值对数组进行多组切片

代码如下

import numpy as np

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
print(names == 'Bob')
print(data[names == 'Bob', :3])

结果如下

[ True False False  True False False False]
[[ 1.08094968 -0.29838004  0.80950847]
 [ 0.10917791  0.79569972  0.47027354]]

需要注意的是Python的关键字and和or对于布尔值数组是没用的,必须使用&和|来代替。

数组的转置和换轴。

数组的转置可以通过T来实现, 通过dot来计算内积

代码如下

import numpy as np

arr = np.arange(15).reshape((3, 5))
print(arr)
print(arr.T)
print(np.dot(arr, arr.T))

结果如下

[[ 0  1  2  3  4]
 [ 5  6  7  8  9]
 [10 11 12 13 14]]
 
[[ 0  5 10]
 [ 1  6 11]
 [ 2  7 12]
 [ 3  8 13]
 [ 4  9 14]]
 
[[ 30  80 130]
 [ 80 255 430]
 [130 430 730]]

ndarray还可以通过transpose来传入轴的编号来进行换轴

代码如下

import numpy as np

arr = np.arange(16).reshape((2, 2, 4))
print(arr)
print(arr.transpose(1, 0, 2))

结果如下

[[[ 0  1  2  3]
  [ 4  5  6  7]]
 [[ 8  9 10 11]
  [12 13 14 15]]]
  
[[[ 0  1  2  3]
  [ 8  9 10 11]]
 [[ 4  5  6  7]
  [12 13 14 15]]]

最后

多则惑,少则得。更多精彩内容可以关注公众号QStack,追寻最纯粹的技术,享受编程的快乐。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值