Numpy 在Python中的基础应用

Numpy 在Python中的基础应用

Python是一种高级语言,它是用于数据科学最常用的编程语言之一。在数据科学领域,对于数据的处理、建模和分析,需要使用许多工具和库。而Numpy是Python中一个非常重要的库,是一个用于科学计算的基础库,被用于从图像处理到自然语言处理等多个领域。本文将着重介绍Numpy在Python中的应用,并着重关注在执行大型数组处理时遇到的内存错误。

阅读更多:Numpy 教程

Numpy的基础应用

创建Numpy数组

在Python中创建一个Numpy数组非常容易,一般需要先导入Numpy模块,然后再创建数组。可以使用
“`numpy.array “`函数来创建一个Numpy数组。

import numpy as np

arr = np.array([1, 2, 3, 4, 5])
print(arr)
Python

输出:

array([1, 2, 3, 4, 5])
Python

如果需要创建一个二维数组,可以输入一个嵌套的列表。

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr)
Python

输出:

array([[1, 2, 3],
       [4, 5, 6],
       [7, 8, 9]])
Python

Numpy的切片和索引

可以使用索引和切片来访问Numpy数组中的元素。当处理二维或n维数组时,一般用“行”和“列”来描述元素的位置。例如,在一个二维数组中,第一个索引代表行,第二个索引代表列。

import numpy as np

arr = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print(arr[0]) # 输出第一行
print(arr[:, 0]) # 输出第一列
Python

输出:

[1 2 3]
[1 4 7]
Python

同时,也可以使用切片操作获取数组的子集。

arr = np.array([1, 2, 3, 4, 5])
print(arr[1:4])
Python

输出:

[2 3 4]
Python

数组的运算和广播

Numpy允许对数组进行各种运算,如加、减、乘、除等。这些运算与Python中的运算非常类似。

import numpy as np

arr1 = np.array([1, 2, 3, 4, 5])
arr2 = np.array([1, 2, 3, 4, 5])

print(arr1 + arr2) # 输出 [2 4 6 8 10]
print(arr1 - arr2) # 输出 [0 0 0 0 0]
print(arr1 * arr2) # 输出 [1 4 9 16 25]
print(arr1 / arr2) # 输出 [1. 1. 1. 1. 1.]
Python

此外,Numpy还有一个非常强大的特性——广播。广播是一种将不同大小的Numpy数组进行运算的方式。例如,给一个较小的数组加上一个较大的数组或者给矩阵加上一个行向量。在本例中,我们将使用Numpy的广播功能将一个二维数组以及一个一维数组相加。

arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2 = np.array([1, 2, 3])

print(arr1 + arr2)
Python

输出:

array([[ 2,  4,  6],
       [ 5,  7,  9],
       [ 8, 10, 12]])
Python

Numpy的聚合函数

Numpy还提供了很多聚合函数,这些函数可以对数组进行一些统计计算,并返回单个值。下面列出了一些常用的聚合函数。

  • sum:计算数组元素的总和。
arr = np.array([1, 2, 3, 4, 5])
print(np.sum(arr)) # 输出 15
Python
  • mean:计算数组元素的平均值。
arr = np.array([1, 2, 3, 4, 5])
print(np.mean(arr)) # 输出 3.0
Python
  • std:计算数组元素的标准差。
arr = np.array([1, 2, 3, 4, 5])
print(np.std(arr)) # 输出 1.4142135623730951
Python
  • max:找出数组元素的最大值。
arr = np.array([1, 2, 3, 4, 5])
print(np.max(arr)) # 输出 5
Python
  • argmax:找出最大元素所在的索引。
arr = np.array([1, 2, 3, 4, 5])
print(np.argmax(arr)) # 输出 4
Python

遇到MemoryError

当处理大型或超大型的数组时,我们有时会遇到MemoryError异常。这是由于Python默认会将所有的变量和数组存储在内存中,当内存不足以存储所有的数组时,就会出现MemoryError。在本节中,我们将讨论如何使用Numpy来解决这个问题。

使用Numpy.memmap

Numpy提供了一个叫做memmap的功能,这个功能可以让我们在处理超大数据集时,只在需要时加载数据。另外,memmap可以让我们获取数据集的一部分,并在不需要它的时候将其释放。在这个过程中,数据始终保留在磁盘上,而不是全部加载到内存中。

使用memmap的方法非常简单。我们首先需要在硬盘上创建一个数据文件。然后使用memmap函数将这个文件映射到一个Numpy数组中。可以使用和普通Numpy数组一样的索引操作来访问这个数组。当访问到这个数组的某个部分时,memmap会将相应的文件部分加载到内存中,然后返回这个数据。在使用完之后,我们可以使用del命令释放这个内存。

下面的示例演示了如何使用memmap来处理超大的数组。我们首先创建一个很大的随机数组,然后将它保存到硬盘上。接着使用memmap函数将这个文件映射为一个Numpy数组。在访问这个数组时,memmap会自动将数据从磁盘上加载到内存中。

import numpy as np

# 创建一个大型数组
big_arr = np.random.rand(100000000)

# 将数组保存到文件
big_arr.tofile('big_arr.dat')

# 使用memmap函数加载这个文件
mmapped_arr = np.memmap('big_arr.dat', dtype=np.float64, mode='r+', shape=(100000000,))

# 访问数组,memmap会将数据自动从磁盘上加载到内存中
print(mmapped_arr[1000])

# 释放内存
del mmapped_arr
Python

分批处理数组

另外一个处理超大数组的方法就是分批处理。这个方法是将一个超大的数组分成若干个小的块,然后对每个块单独处理。处理完一个块后,将其释放,然后再处理下一个块。这样可以避免将整个数组加载到内存中。

下面的示例演示了如何使用分批处理方法来处理超大数组。我们首先创建一个超大的随机Numpy数组,然后将这个数组分成10个块,每个块的大小为1000。然后对每个块进行一些简单的操作。

import numpy as np

# 创建一个大型数组
big_arr = np.random.rand(100000)

# 将数组分成10个块,每个块大小为1000
num_blocks = 10
block_size = 10000

for i in range(num_blocks):
    # 获取这个块的起始和结束位置
    start = i * block_size
    end = start + block_size

    # 获取这个块的数据
    block = big_arr[start:end]

    # 对这个块执行一些操作
    block_mean = np.mean(block)
    block_std = np.std(block)

    # 输出结果
    print("块 %d:平均值 %f,标准差 %f" % (i, block_mean, block_std))
Python

使用Pandas库

另一个解决超大数组问题的方法是使用Pandas库。Pandas是Python中一个非常强大的数据处理库,被广泛应用于数据分析和数据挖掘。Pandas提供了一个叫做DataFrame的数据结构,这个结构可以表示和处理超大的二维数组。

Pandas中的DataFrame可以看做是Numpy中的二维数组的扩展版。与Numpy数组不同的是,DataFrame可以包含不同类型的数据,如字符串和日期等。另外,DataFrame支持列名和行标签,这可以使我们更方便地对数组进行操作和访问。

下面是一个简单的示例,演示了如何使用Pandas来处理超大数据集。我们首先创建一个非常大的随机Numpy数组,然后将其放入一个Pandas DataFrame中。在访问DataFrame时,Pandas会自动将需要的数据加载到内存中,而不是全部加载到内存中。这意味着我们可以处理比可用内存还大的数据集。

import numpy as np
import pandas as pd

# 创建一个大型数组
big_arr = np.random.rand(100000000)

# 将数组放入一个Pandas DataFrame中
df = pd.DataFrame(big_arr)

# 访问DataFrame中的数据,Pandas会自动加载需要的数据
print(df[1000])
Python

总结

本文介绍了Numpy在Python中的基础应用,包括创建Numpy数组、切片和索引、数组运算和广播、聚合函数等。另外,本文还讨论了当处理超大数组时遇到的MemoryError异常,给出了使用Numpy.memmap、分批处理数组和使用Pandas库来解决这个问题的方法。对于数据科学领域中的Python程序员而言,掌握Numpy和解决内存问题是非常重要的。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册