如何在Python中创建Numpy数组

329 阅读13分钟

Numpy数组在Python中被使用,特别是在数据分析、机器学习和数据科学中被用来处理数字数据。在这篇文章中,我们将使用例子和工作代码讨论在Python中创建numpy数组的不同方法。

在Python中,有各种函数来创建numpy数组。让我们逐一讨论它们。

在Python中从列表到Numpy数组

我们可以使用numpy.array() 函数从一个Python列表创建一个numpy数组。array() 函数将一个列表作为其输入参数并返回一个numpy数组。在这种情况下,数组元素的数据类型与列表中元素的数据类型相同。

myList=[1,2,3,4,5]
print("The list is:")
print(myList)
myArr = np.array(myList)
print("The array is:")
print(myArr)
print("The data type of array is:")
print(myArr.dtype)

输出。

The list is:
[1, 2, 3, 4, 5]
The array is:
[1 2 3 4 5]
The data type of array is:
int64

在上面的代码中,我们首先使用array() 函数创建了一个numpy数组。之后,我们使用NumPy数组的dtype 属性来获得数组中元素的数据类型。在这里,你可以看到,一个整数列表给了我们一个数据类型为int64 的元素数组。

你也可以使用array() 函数中的dtype 参数明确指定数组元素的数据类型,如下例所示。

myList=[1,2,3,4,5]
print("The list is:")
print(myList)
myArr = np.array(myList,dtype="float")
print("The array is:")
print(myArr)
print("The data type of array is:")
print(myArr.dtype)

输出。

The list is:
[1, 2, 3, 4, 5]
The array is:
[1. 2. 3. 4. 5.]
The data type of array is:
float64

在上面的代码中,我们给出了一个整数的列表作为输入参数。然而,输出的数组包含数据类型为float64 的元素,因为我们在创建数组时指定了这一类型。

要创建一个二维numpy数组,你可以将一个列表传递给array() ,如下图所示。

myList=[[1,2,3,4,5],[6,7,8,9,10]]
print("The list is:")
print(myList)
myArr = np.array(myList,dtype="float")
print("The array is:")
print(myArr)
print("The data type of array is:")
print(myArr.dtype)

输出。

The list is:
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
The array is:
[[ 1.  2.  3.  4.  5.]
 [ 6.  7.  8.  9. 10.]]
The data type of array is:
float64

创建一个具有不同数据类型元素的Numpy数组

如果输入的列表包含不同但兼容的数据类型的元素,numpy数组中的元素会自动转换为更广泛的数据类型。例如,如果我们有一个floats和ints的列表,结果numpy数组的元素将是float64数据类型。你可以在下面的例子中观察到这一点。

myList=[1,3.14,4,5]
print("The list is:")
print(myList)
myArr = np.array(myList)
print("The array is:")
print(myArr)
print("The data type of array is:")
print(myArr.dtype)

输出。

The list is:
[1, 3.14, 4, 5]
The array is:
[1.   3.14 4.   5.  ]
The data type of array is:
float64

这里,我们给出了一个包含整数和浮点数的列表。由于这个原因,numpy数组的所有元素都被转换为浮点数。

如果输入的列表包含str和int这样的数据类型,产生的numpy数组元素将有字符串数据类型,用<u32或<u64表示。这表明这些元素被作为unicode对象分别存储在4字节或8字节中。

myList=[1,"Aditya", 3.14,4,5]
print("The list is:")
print(myList)
myArr = np.array(myList)
print("The array is:")
print(myArr)
print("The data type of array is:")
print(myArr.dtype)

输出。

The list is:
[1, 'Aditya', 3.14, 4, 5]
The array is:
['1' 'Aditya' '3.14' '4' '5']
The data type of array is:
<U32

当输入的列表元素具有不同的数据类型时,你也可以选择指定阵列元素的数据类型。例如,如果你有一个浮点数和英寸的列表,你想让数组元素的数据类型为英寸,你可以在dtype 参数中指定,如下所示。

myList=[1, 3.14,4,5]
print("The list is:")
print(myList)
myArr = np.array(myList,dtype="int")
print("The array is:")
print(myArr)
print("The data type of array is:")
print(myArr.dtype)

输出。

The list is:
[1, 3.14, 4, 5]
The array is:
[1 3 4 5]
The data type of array is:
int64

在这里,你可以看到数据类型为float的列表元素已经被转换为int。因此,3.14已经被转换为3。

你也可以将这些元素转换为其他数据类型,比如字符串,如下图所示。

myList=[1, 3.14,4,5]
print("The list is:")
print(myList)
myArr = np.array(myList,dtype="str")
print("The array is:")
print(myArr)
print("The data type of array is:")
print(myArr.dtype)

输出。

The list is:
[1, 3.14, 4, 5]
The array is:
['1' '3.14' '4' '5']
The data type of array is:
<U4

在指定数组元素的数据类型时,你需要确保输入列表中的所有元素都能被转换为numpy数组中的指定数据类型。如果不这样做,程序就会遇到错误。例如,我们不能将一个字母转换成一个整数。因此,如果我们为一个包含有字母的字符串的输入列表指定numpy数组的目标数据类型为int,程序将遇到TypeError异常,如下所示。

myList=[1,"Aditya", 3.14,4,5]
print("The list is:")
print(myList)
myArr = np.array(myList,dtype="int")
print("The array is:")
print(myArr)
print("The data type of array is:")
print(myArr.dtype)

输出。

The list is:
[1, 'Aditya', 3.14, 4, 5]
ValueError                                Traceback (most recent call last)
/tmp/ipykernel_4810/3347589872.py in <module>
      2 print("The list is:")
      3 print(myList)
----> 4 myArr = np.array(myList,dtype="int")
      5 print("The array is:")
      6 print(myArr)

ValueError: invalid literal for int() with base 10: 'Aditya'

在这个例子中,我们指定数组元素的数据类型为整数。然而,输入的列表中包含了一个不能被转换为整数的字符串。因此,程序遇到ValueError invalid literal for int() with base 10 错误。

在Python中检查Numpy数组的属性

你可以对Numpy数组进行许多操作来检查其属性。例如,你可以使用numpy数组的ndim 属性来检查数组的尺寸,如下所示。

myList=[1,"Aditya", 3.14,4,5]
print("The list is:")
print(myList)
myArr = np.array(myList,dtype="str")
print("The array is:")
print(myArr)
print("The dimension of array is:")
print(myArr.ndim)

输出。

The list is:
[1, 'Aditya', 3.14, 4, 5]
The array is:
['1' 'Aditya' '3.14' '4' '5']
The dimension of array is:
1

这里,我们创建了一个一维数组。因此,它的维数是1。

对于一个二维列表的输入,数组的维数将是2,如下图所示。

myList=[[1,2,3,4,5],[6,7,8,9,10]]
print("The list is:")
print(myList)
myArr = np.array(myList,dtype="str")
print("The array is:")
print(myArr)
print("The dimension of array is:")
print(myArr.ndim)

输出。

The list is:
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
The array is:
[['1' '2' '3' '4' '5']
 ['6' '7' '8' '9' '10']]
The dimension of array is:
2

为了检查numpy数组中数组元素的数据类型,你可以使用dtype 属性。dtype 属性给出一个dtype 对象作为输出。为了获得数据类型的名称,你可以使用 dtype.name 属性,在前面的章节中已经讨论过。

你也可以使用shape 属性找到numpy数组的形状。numpy数组的shape 属性会返回一个元组,其第一和第二元素分别为行数和列数。你可以在下面的例子中观察到这一点。

myList=[[1,2,3,4,5],[6,7,8,9,10]]
print("The list is:")
print(myList)
myArr = np.array(myList,dtype="str")
print("The array is:")
print(myArr)
print("The shape of array is:")
print(myArr.shape)

输出。

The list is:
[[1, 2, 3, 4, 5], [6, 7, 8, 9, 10]]
The array is:
[['1' '2' '3' '4' '5']
 ['6' '7' '8' '9' '10']]
The shape of array is:
(2, 5)

在这个例子中,我们创建了一个具有2-D列表的numpy数组,其内部有两个各5个元素的列表。因此,numpy数组的形状是(2,5)。

创建零、一和特定序列的Numpy数组

使用内置的数组操作,我们可以创建不同类型的numpy数组。让我们来讨论其中的一些。

在Python中创建包含1的Numpy数组

你可以使用ones() 函数创建包含1的numpy数组。要使用ones() 函数创建一个包含1的一维数组,你需要将数组中需要的元素数量作为输入参数。执行后,ones() 函数将返回一个具有所需元素数量的一维numpy数组,如下图所示。

myArr = np.ones(5)
print("The array is:")
print(myArr)

输出。

The array is:
[1. 1. 1. 1. 1.]

默认情况下,数组中元素的数据类型是float64。要创建一个整数数组,你可以使用ones() 函数的dtype 参数来指定元素的数据类型,如下例所示。

myArr = np.ones(5,dtype="int")
print("The array is:")
print(myArr)

输出。

The array is:
[1 1 1 1 1]

在这里,你可以看到数组包含整数作为其元素,而不是浮点数。

要使用ones() 函数创建 2-D 数组,你可以向ones() 函数传递一个包含行数和列数的元组,格式为 (number_of_rows, number_of_columns) 。执行后,ones() 函数将返回所需的数组。

myArr = np.ones((2,3),dtype="int")
print("The array is:")
print(myArr)

输出。

The array is:
[[1 1 1]
 [1 1 1]]

同样,数组中元素的默认数据类型是float64 。因此,你可以使用ones() 函数的参数dtype ,改变数组元素的数据类型。

在Python中创建包含0的Numpy数组

就像1的数组一样,你也可以使用zeros() 函数创建包含0的numpy数组。

要使用zeros() 函数创建一个包含1的一维数组,你需要传递数组中所需要的元素数量作为输入参数。执行后,zeros() 函数将返回一个具有所需零数的一维numpy数组,如下图所示。

myArr = np.zeros(5)
print("The array is:")
print(myArr)

输出。

The array is:
[0. 0. 0. 0. 0.]

默认情况下,数组中元素的数据类型是float64 。要创建一个整数数组,你可以使用zeros() 函数的dtype 参数来指定元素的数据类型,如下例所示。

myArr = np.zeros(5,dtype="int")
print("The array is:")
print(myArr)

输出。

The array is:
[0 0 0 0 0]

在这里,你可以看到数组包含整数作为其元素,而不是浮点数字。

要使用zeros() 函数创建二维数组,你可以向zeros() 函数传递一个包含行数和列数的元组,格式为(number_of_rows, number_of_columns) 。执行后,zeros() 函数将返回所需的带零的数组,如下图所示。

myArr = np.zeros((2,3),dtype="int")
print("The array is:")
print(myArr)

输出。

The array is:
[[0 0 0]
 [0 0 0]]

同样,数组中元素的默认数据类型是float64 。因此,你可以使用zeros() 函数的参数dtype ,改变数组元素的数据类型。

用0到1之间的随机数创建Numpy数组

你可以使用numpy.random.rand() 函数来创建元素范围为0到1的numpy数组。

要创建一个1-D的numpy数组,你可以将所需元素的数量作为输入参数传给rand() 。执行后,rand() 函数返回一个numpy数组,包含指定数量的0到1之间的浮点数。

myArr = np.random.rand(5)
print("The array is:")
print(myArr)

输出。

The array is:
[0.693256   0.26514033 0.86510414 0.52163653 0.1188453 ]

要创建一个二维随机数组,可以将行数作为第一个输入参数,将所需数组的列数作为第二个参数。执行后,rand() 函数将返回具有所需形状的numpy数组,如下图所示。

myArr = np.random.rand(2,3)
print("The array is:")
print(myArr)

输出。

The array is:
[[0.03166493 0.06408176 0.73167115]
 [0.49889714 0.34302884 0.9395251 ]]

用随机整数创建Numpy数组

要在一个范围内用随机整数创建一个numpy数组,你可以使用random.randint() 函数。random.randint() 函数的语法如下。

random.randint(start, end, number_of_elements)

这里。

  • 参数start 表示一个范围的起始数。
  • 参数end 表示一个范围内的最后一个数字。
  • 参数number_of_elements 表示所需数组中的元素数量。

默认情况下,random.randint() 函数返回的数组元素的数据类型是int64

myArr = np.random.randint(2,100,5)
print("The array is:")
print(myArr)

输出。

The array is:
[22 10 30 87 96]

你不能通过指定dtype 参数来使用randint() 函数创建一个浮点数组。如果你试图这样做,程序将遇到一个TypeError 异常。

在Python中创建元素在一个范围内的Numpy数组

如果你想创建一个元素在某个范围内的Numpy数组,你可以使用numpy.arange() 函数来实现。

要创建一个元素从0到N的数组,你可以把N作为输入参数传给 arange() 函数。在arange() 函数返回的数组中,你只能得到N-1之前的数字。这是因为N在范围内是排他的。

myArr = np.arange(10)
print("The array is:")
print(myArr)

输出。

The array is:
[0 1 2 3 4 5 6 7 8 9]

在这里,我们将10传给了arange() 函数。因此,它返回了一个包含0到9的元素的数组。

要创建一个元素在M和N之间的numpy数组,你可以将M作为第一个输入参数,N作为第二个输入参数传给arange() 。执行后,你将得到一个包含从M到N-1数字的numpy数组。

myArr = np.arange(3,10)
print("The array is:")
print(myArr)

输出。

The array is:
[3 4 5 6 7 8 9]

这里,N必须大于M,否则,你将得到一个空数组,如下图所示。

myArr = np.arange(13,10)
print("The array is:")
print(myArr)

输出。

The array is:
[]

你也可以决定数组中两个连续元素之间的差异。为此,你可以将所需的数字之差作为第三个输入参数传给arange() 函数。执行后,它将返回一个numpy数组,该数组中的元素在一个范围内,它们之间有一个常数差。

myArr = np.arange(3,10,2)
print("The array is:")
print(myArr)

输出。

The array is:
[3 5 7 9]

如果你想得到一个元素递减的数组,你可以把一个较大的数字作为第一个输入,把一个较小的数字作为第二个输入参数传给arange() 。作为第三个输入参数,你需要传递一个负数作为两个连续元素的差。通过这种方式,你将得到一个元素按递减顺序排列的numpy数组,如下例所示。

myArr = np.arange(23,10,-2)
print("The array is:")
print(myArr)

输出。

The array is:
[23 21 19 17 15 13 11]

默认情况下, arange() 函数返回一个以整数为元素的数组。为了得到一个浮点数数组,你可以在arange() 函数的dtype 参数中指定数据类型,如下图所示。

myArr = np.arange(23,10,-2,dtype="float")
print("The array is:")
print(myArr)

输出。

The array is:
[23. 21. 19. 17. 15. 13. 11.]

一个范围内所需元素数量的Numpy数组

与其决定numpy数组中元素的范围,你也可以指定你想包含在数组中的、在给定范围内的元素数量。为此,你可以使用linspace() 函数。

linspace() 函数的语法如下。

linspace(start, end, number_of_elements)

这里。

  • 参数start 表示一个范围的起始数。
  • 参数end 表示一个范围的最后一个数字。
  • 参数number_of_elements 表示所需数组中的元素数量。

默认情况下,linspace() 函数返回的数组元素的数据类型是float64

myArr = np.linspace(2,50,10)
print("The array is:")
print(myArr)

输出。

The array is:
[ 2.          7.33333333 12.66666667 18.         23.33333333 28.66666667
 34.         39.33333333 44.66666667 50.        ]

你也可以通过给end参数传递一个较小的数字,给start参数传递一个较大的数字,以相反的顺序获得数组中的元素,如下所示。

myArr = np.linspace(122,50,10)
print("The array is:")
print(myArr)

输出。

The array is:
[122. 114. 106.  98.  90.  82.  74.  66.  58.  50.]

linspace() 函数返回一个浮点数的数组。然而,你可以通过使用linspace() 函数的dtype 参数来创建一个整数元素的numpy数组。为此,你只需要在linspace() 方法中把字面意思 "int" 和其他输入参数一起传给dtype 参数。

在Python中向Numpy数组中加载一个文件

你也可以通过加载一个文本文件来创建一个numpy数组。为此,你可以使用loadtxt() 函数。

loadtxt() 函数将文件名作为其第一个输入参数,将元素的数据类型作为dtype参数的输入参数。执行后,它返回一个numpy数组,如下图所示。

File_data = np.loadtxt("1d.txt", dtype=int)
print(File_data)

输出。

[1 2 3 5 6]

如果输入文件中有除空格和数字以外的字符,程序会出错。你可以在下面的例子中观察到这一点。

File_data = np.loadtxt("1d.txt", dtype=int)
print(File_data)

输出。

ValueError                                Traceback (most recent call last)
/tmp/ipykernel_4810/1616002059.py in <module>
----> 1 File_data = np.loadtxt("1d.txt", dtype=int)
      2 print(File_data)

ValueError: invalid literal for int() with base 10: '1,2,3,5,6'

你可以通过读取一个具有二维数据的文件来创建一个二维的numpy数组,如下图所示。

File_data = np.loadtxt("2d.txt", dtype=int)
print(File_data)

输出。

[[1 2 3]
 [4 5 6]
 [7 8 9]]

通过观察输出,我们可以推断出loadtxt() ,该函数首先将文件读成一个字符串。之后,它在换行处将文件分割。换行后的每个字符串被认为是一个新行。然后,它在空格处分割每一行,以获得numpy数组中的各个元素。

总结

在这篇文章中,我们已经讨论了在Python中使用numpy模块创建数组的不同方法。