前言
时隔两个月,我又回来了,期间发生了很多很多的事情,也曾对自己产生了怀疑,对自己的坚持产生了怀疑。不过在颓废之后总是奋进,而生活也要继续,只能以“雄关漫道真如铁,而今迈步从头越”来自勉了。正好回家居家隔离,我要立一个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,追寻最纯粹的技术,享受编程的快乐。
Python NumPy:入门与ndarray操作详解
4832

被折叠的 条评论
为什么被折叠?



