my_list.min
1
print('Time elapsed in milliseconds: ’ + str((time.time - start) * 1000))
Time elapsed in milliseconds: 1151.1778831481934
start = time.time
my_list.max
999999999
print('Time elapsed in milliseconds: ’ + str((time.time - start) * 1000))
Time elapsed in milliseconds: 1114.8970127105713
找到最小值花了大约 1151 毫秒,找到最大值 1114 毫秒。这大约是 1 秒。
正如你所看到的,使用 NumPy 可以将寻找一个大约有 10 亿个值的列表的最小值和最大值的时间 从大约 28 秒减少到 1 秒。这就是 NumPy 的强大之处。
使用 Python 列表创建 ndarray
有几种方法可以在 NumPy 中创建 ndarray。
你可以通过使用元素列表来创建一个 ndarray:
my_ndarray = np.array([1, 2, 3, 4, 5])
print(my_ndarray)
[1 2 3 4 5]
有了上面的 ndarray 定义,我将检查几件事。首先,上面定义的变量的类型是 numpy.ndarray
。这是所有 NumPy ndarray 的类型:
type(my_ndarray)
这里要注意的另一件事是 “形状shape”。ndarray 的形状是 ndarray 的每个维度的长度。你可以看到,my_ndarray
的形状是(5,)
。这意味着my_ndarray
包含一个有 5 个元素的维度(轴)。
np.shape(my_ndarray)
(5,)
数组中的维数被称为它的 “秩rank”。所以上面的 ndarray 的秩是 1。
我将定义另一个 ndarray my_ndarray2
作为一个多维 ndarray。那么它的形状会是什么呢?请看下面:
my_ndarray2 = np.array([(1, 2, 3), (4, 5, 6)])
np.shape(my_ndarray2)
(2, 3)
这是一个秩为 2 的 ndarray。另一个要检查的属性是 dtype
,也就是数据类型。检查我们的 ndarray 的dtype
可以得到以下结果:
my_ndarray.dtype
dtype(‘int64’)
int64
意味着我们的 ndarray 是由 64 位整数组成的。NumPy 不能创建混合类型的 ndarray,必须只包含一种类型的元素。如果你定义了一个包含混合元素类型的 ndarray,NumPy 会自动将所有的元素类型转换为可以包含所有元素的最高元素类型。
例如,创建一个 int
和float
的混合序列将创建一个float64
的 ndarray:
my_ndarray2 = np.array([1, 2.0, 3])
print(my_ndarray2)
[1. 2. 3.]
my_ndarray2.dtype
dtype(‘float64’)
另外,将其中一个元素设置为 string
将创建dtype
等于
my_ndarray2 = np.array([1, ‘2’, 3])
print(my_ndarray2)
[‘1’ ‘2’ ‘3’]
my_ndarray2.dtype
dtype(’
size
属性将显示我们的 ndarray 中存在的元素总数:
my_ndarray = np.array([1, 2, 3, 4, 5])
my_ndarray.size
5
使用 NumPy 方法创建 ndarray
如果你不想直接使用列表来创建 ndarray,还有几种可以用来创建它的 NumPy 方法。
你可以使用 np.zeros
来创建一个填满 0 的 ndarray。它需要一个“形状”作为参数,这是一个包含行数和列数的列表。它还可以接受一个可选的dtype
参数,这是 ndarray 的数据类型:
my_ndarray = np.zeros([2,3], dtype=int)
print(my_ndarray)
[[0 0 0]
[0 0 0]]
你可以使用 np. ones
来创建一个填满1
的 ndarray:
my_ndarray = np.ones([2,3], dtype=int)
print(my_ndarray)
[[1 1 1]
[1 1 1]]
你可以使用 np.full
来给 ndarray 填充一个特定的值:
my_ndarray = np.full([2,3], 10, dtype=int)
print(my_ndarray)
[[10 10 10]
[10 10 10]]
你可以使用 np.eye
来创建一个单位矩阵 / ndarray,这是一个沿主对角线都是1
的正方形矩阵。正方形矩阵是一个行数和列数相同的矩阵:
my_ndarray = np.eye(3, dtype=int)
print(my_ndarray)
[[1 0 0]
[0 1 0]
[0 0 1]]
你可以使用 np.diag
来创建一个沿对角线有指定数值的矩阵,而在矩阵的其他部分为0
:
my_ndarray = np.diag([10, 20, 30, 40, 50])
print(my_ndarray)
[[10 0 0 0 0]
[ 0 20 0 0 0]
[ 0 0 30 0 0]
[ 0 0 0 40 0]
[ 0 0 0 0 50]]
你可以使用 np.range
来创建一个具有特定数值范围的 ndarray。它是通过指定一个整数的开始和结束(不包括)范围以及一个步长来创建的:
my_ndarray = np.arange(1, 20, 3)
print(my_ndarray)
[ 1 4 7 10 13 16 19]
读取 ndarray
ndarray 的值可以使用索引、分片或布尔索引来读取。
使用索引读取 ndarray 的值
在索引中,你可以使用 ndarray 的元素的整数索引来读取数值,就像你读取 Python 列表一样。就像 Python 列表一样,索引从 0
开始。
例如,在定义如下的 ndarray 中:
my_ndarray = np.arange(1, 20, 3)
第四个值将是 my_ndarray[3]
,即10
。最后一个值是my_ndarray[-1]
,即19
:
my_ndarray = np.arange(1, 20, 3)
print(my_ndarray[0])
1
print(my_ndarray[3])
10
print(my_ndarray[-1])
19
print(my_ndarray[5])
16
print(my_ndarray[6])
19
使用分片读取 ndarray
你也可以使用分片来读取 ndarray 的块。分片的工作方式是用冒号(:
)操作符指定一个开始索引和一个结束索引。然后,Python 将获取该开始和结束索引之间的 ndarray 片断:
print(my_ndarray[:])
[ 1 4 7 10 13 16 19]
print(my_ndarray[2:4])
[ 7 10]
print(my_ndarray[5:6])
[16]
print(my_ndarray[6:7])
[19]
print(my_ndarray[:-1])
[ 1 4 7 10 13 16]
print(my_ndarray[-1:])
[19]
分片创建了一个 ndarray 的引用(或视图)。这意味着,修改分片中的值也会改变原始 ndarray 的值。
比如说:
my_ndarray[-1:] = 100
print(my_ndarray)
[ 1 4 7 10 13 16 100]
对于秩超过 1 的 ndarray 的分片,可以使用 [行开始索引:行结束索引, 列开始索引:列结束索引]
语法:
my_ndarray2 = np.array([(1, 2, 3), (4, 5, 6)])
print(my_ndarray2)
[[1 2 3]
[4 5 6]]
print(my_ndarray2[0:2,1:3])
[[2 3]
[5 6]]
使用布尔索引读取 ndarray 的方法
读取 ndarray 的另一种方法是使用布尔索引。在这种方法中,你在方括号内指定一个过滤条件,然后返回符合该条件的 ndarray 的一个部分。
例如,为了获得一个 ndarray 中所有大于 5 的值,你可以指定布尔索引操作 my_ndarray[my_ndarray > 5]
。这个操作将返回一个包含所有大于 5 的值的 ndarray:
my_ndarray = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10])
my_ndarray2 = my_ndarray[my_ndarray > 5]
print(my_ndarray2)
[ 6 7 8 9 10]
例如,为了获得一个 ndarray 中的所有偶数值,你可以使用如下的布尔索引操作:
(1)Python所有方向的学习路线(新版)
这是我花了几天的时间去把Python所有方向的技术点做的整理,形成各个领域的知识点汇总,它的用处就在于,你可以按照上面的知识点去找对应的学习资源,保证自己学得较为全面。
最近我才对这些路线做了一下新的更新,知识体系更全面了。
(2)Python学习视频
包含了Python入门、爬虫、数据分析和web开发的学习视频,总共100多个,虽然没有那么全面,但是对于入门来说是没问题的,学完这些之后,你可以按照我上面的学习路线去网上找其他的知识资源进行进阶。
(3)100多个练手项目
我们在看视频学习的时候,不能光动眼动脑不动手,比较科学的学习方法是在理解之后运用它们,这时候练手项目就很适合了,只是里面的项目比较多,水平也是参差不齐,大家可以挑自己能做的项目去练练。
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!