一文掌握numpy数组的创建、索引和切片操作

文章目录

1.1 array函数创建数组

最简单也是最直观的方式,就是使用array函数直接创建numpy数组。

import numpy as np

ndarray = np.array([1, 2, 3, 4])
print(ndarray)

ndarray = np.array(list('abcdefg'))
print(ndarray)

ndarray = np.array([[11, 22, 33, 44], [10, 20, 30, 40]])
print(ndarray)
'''
[[11 22 33 44]
 [10 20 30 40]]
'''

1.2 asarray函数创建数组

asarray将输入转换为ndarray,如果输入本身就是一个ndarray就不进行复制,而只是创建一个数组视图(内存和值一致)。

当数据源是ndarray时,array与asarray的区别: array会创建一个新的数组,占用新的内存,但asarray不会新建数组,只是创建一个数组视图

当数据源是其它类型时,asarray与array的效果一致。

import numpy as np

a=np.random.random((3,3))
b=np.array(a,dtype='float64')
c=np.asarray(a,dtype='float64')
a[2]=2
print(a)
'''
[[0.4593994  0.94093065 0.25819247]
 [0.29774257 0.32810293 0.31841724]
 [2.         2.         2.        ]]
'''
print(b)
'''
[[0.4593994  0.94093065 0.25819247]
 [0.29774257 0.32810293 0.31841724]
 [0.45421249 0.85030328 0.98043655]]
'''
print(c)
'''
[[0.4593994  0.94093065 0.25819247]
 [0.29774257 0.32810293 0.31841724]
 [2.         2.         2.        ]]
'''

1.3 zeros和zeros_like创建数组

  • zeros:表示直接创建全零数组
  • zeros_like:根据传入的ndarray数组的shape来创建所有元素为0的数组
import numpy as np

ndarray = np.zeros(10)
print(ndarray)

ndarray = np.zeros((2, 2))
print(ndarray)
'''
[[0. 0.]
 [0. 0.]]
 '''

ndarray = np.array([[11, 22, 33, 44], [10, 20, 30, 40]])
ndarray1 = np.zeros_like(ndarray)
print(ndarray1)
'''
[[0 0 0 0]
 [0 0 0 0]]
'''

1.4 ones和ones_like创建数组

用于创建所有元素都为1的数组。ones_like用法同zeros_like用法

import numpy as np

ndarray = np.ones(10)
print(ndarray)

ndarray = np.ones((2, 2))
print(ndarray)
'''
[[1. 1.]
 [1. 1.]]
 '''

ndarray = np.array([[11, 22, 33, 44], [10, 20, 30, 40]])
ndarray1 = np.ones_like(ndarray)
print(ndarray1)
'''
[[1 1 1 1]
 [1 1 1 1]]
'''

1.5 empty和empty_like创建数组

用于创建空数组,空数据中的值并不为0,而是 未初始化的随机值.

import numpy as np

ndarray = np.empty(3)
print(ndarray)

ndarray = np.empty((2, 2))
print(ndarray)
'''
[[1.9638129e-316 0.0000000e+000]
 [7.9050503e-323 7.9050503e-323]]
 '''

ndarray = np.array([[11, 22, 33, 44], [10, 20, 30, 40]])
ndarray1 = np.empty_like(ndarray)
print(ndarray1)
'''
[[              0               0 139955131091248 139957403317784]
 [139957403322480 139955459383168 139955130963144 139955459420264]]
'''

1.6 arange创建数组

arange函数是python内置函数range函数的 数组版本

import numpy as np

ndarray = np.arange(10)
print(ndarray)

ndarray = np.arange(10,20)
print(ndarray)

ndarray = np.arange(10,20,2)
print(ndarray)

1.7 linspace创建数组

numpy.linspace 函数用于创建一个一维数组,数组是一个等差数列构成的,格式如下:

np.linspace(start, stop, num=50, endpoint=True, retstep=False, dtype=None)

参数说明start序列的起始值stop序列的终止值,如果endpoint为true,该值包含于数列中num要生成的等步长的样本数量,默认为50endpoint该值为 true 时,数列中包含stop值,反之不包含,默认是True。retstep如果为 True 时,生成的数组中会显示间距,反之不显示。dtypendarray 的数据类型

代码举例:

import numpy as np
a = np.linspace(1,10,10)
print(a)

1.8 eye、identity创建对角数组

eye与identity都可以生成部分元素为1,其余为0的数组,不同的是, identity只能创建方阵,且对角为1,而eye不只能创建方阵,而且可以指定1的偏移位置,它们的区别如下。

np.identity(n, dtype=None)

np.eye(N, M=None, k=0, dtype=<type 'float'>)

代码举例:

import numpy as np

ndarray = np.identity(4)
print(ndarray)

'''
[[1. 0. 0. 0.]
 [0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]]
'''

ndarray = np.eye(4,k=1)
print(ndarray)
'''
[[0. 1. 0. 0.]
 [0. 0. 1. 0.]
 [0. 0. 0. 1.]
 [0. 0. 0. 0.]]
'''

1.9 full——创建自定义的数组

创建 10&#x4E2A;nan&#x503C;&#x6570;&#x7EC4;

一文掌握numpy数组的创建、索引和切片操作

还可以用list重复来代替( &#x8FD9;&#x91CC;&#x7684;np.nan&#x4E5F;&#x53EF;&#x4EE5;&#x4E3A;&#x81EA;&#x5B9A;&#x4E49;&#x7C7B;&#x578B;):

一文掌握numpy数组的创建、索引和切片操作

; 2. 索引与切片

索引顺序和列表顺序一致,如下图所示。

一文掌握numpy数组的创建、索引和切片操作

2.1 一维数组

一维数组很简单,基本和列表一致。它们的区别在于数组切片是原始数组视图,而列表为浅拷贝。(这就意味着对于数组, &#x5982;&#x679C;&#x505A;&#x4EFB;&#x4F55;&#x4FEE;&#x6539;&#xFF0C;&#x539F;&#x59CB;&#x4E5F;&#x4F1A;&#x8DDF;&#x7740;&#x66F4;&#x6539;,),这也意味着,如果不想更改原始数组,我们需要进行显式的复制,从而得到它的副本(.copy())。

import numpy as np

arr = np.arange(10)

print(arr[4])
print(arr[3:6])

arr_old_nocopy = arr
arr_old_copy = arr.copy()
arr[3:6] = 33
print(arr)
print(arr_old_copy)
print(arr_old_nocopy)

2.2 二维数组

二维数组中,如果[ ]内只有一个元素,则取的是一个一维数组。如果想要取值,则需要使用 &#x4E24;&#x4E2A;[]&#x6216;&#x8005;&#x7528;&#x9017;&#x53F7;&#x9694;&#x5F00;&#x884C;&#x548C;&#x5217;

import numpy as np

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

print(arr[0])
print(arr[0,:])
print(arr[0,...])

print(arr[:,1])
print(arr[... , 1])

print(arr[0:2,1:2])
'''
[[2]
 [5]]
'''

print(arr[::2,::2])
'''
[[1 3]
 [7 9]]
'''

print(arr[1,2])
print(arr[1][2])

2.3 多维数组

这个和而二维数组一样理解,只不过它是多维数组。

import numpy as np

arr = np.arange(12)
arr = arr.reshape(2,2,3)

'''
[[[ 0  1  2]
  [ 3  4  5]]

 [[ 6  7  8]
  [ 9 10 11]]]
'''

print(arr[0])
'''
索引==》
[[0 1 2]
 [3 4 5]]
'''

print(arr[1,0,1])
print(arr[1][0][1])

print(arr[0,1])
arr[0] = 100
print(arr)
'''
[[[100 100 100]
  [100 100 100]]

 [[  6   7   8]
  [  9  10  11]]]
'''

2.4 布尔型索引

先来看一个列子:

import numpy as np

arr = (np.arange(36)).reshape(6,6)
print(arr)
'''
[[ 0  1  2  3  4  5]
 [ 6  7  8  9 10 11]
 [12 13 14 15 16 17]
 [18 19 20 21 22 23]
 [24 25 26 27 28 29]
 [30 31 32 33 34 35]]
'''
x = np.array([0, 1, 2, 1, 4, 5])
arr1 = np.array(x==1)
print(arr1)
print(arr[x==1])
'''
[[ 6  7  8  9 10 11]
 [18 19 20 21 22 23]]
'''
  • 从结果上看,布尔索引取出了布尔值为True的行。
  • 布尔型数组的长度和索引的数组的行数(轴长度)必须一致。
  • 布尔型数组可与切片,整数(整数序列)一起使用。
import numpy as np

arr = (np.arange(36)).reshape(6,6)

x = np.array([0, 1, 2, 1, 4, 5])

print(arr[x == 1,2:])
'''
[[ 8  9 10 11]
 [20 21 22 23]]
'''

print(arr[x == 1,-3:])
'''
[[ 9 10 11]
 [21 22 23]]
'''
print(arr[x==1,3])

同理,可以使用不等于、大于、小于等操作进行索引与切片。

2.5 花式索引

花式索引(Fancy indexing),指的是利用整数数组进行索引。

  • 传入单个列表或数组
import numpy as np

arr = np.empty((8,4))

for i in range(8):
    arr[i] = i

print(arr[[2,6,1]])

'''
[[2. 2. 2. 2.]
 [6. 6. 6. 6.]
 [1. 1. 1. 1.]]
'''
print(arr[[-2,-6,-1]])
'''
[[6. 6. 6. 6.]
 [2. 2. 2. 2.]
 [7. 7. 7. 7.]]
'''
  • 传入多个索引数组

&#x4F1A;&#x8FD4;&#x56DE;&#x4E00;&#x4E2A;&#x4E00;&#x7EF4;&#x6570;&#x7EC4;&#xFF0C;&#x5176;&#x4E2D;&#x7684;&#x5143;&#x7D20;&#x5BF9;&#x5E94;&#x5404;&#x4E2A;&#x7D22;&#x5F15;&#x5143;&#x7D20;

import numpy as np

arr = np.arange(35).reshape(5,7)
print(arr)
'''
[[ 0  1  2  3  4  5  6]
 [ 7  8  9 10 11 12 13]
 [14 15 16 17 18 19 20]
 [21 22 23 24 25 26 27]
 [28 29 30 31 32 33 34]]
'''
print(arr[[1,3,2,4],[2,0,6,5]])

同理多维数组的花式索引也是一样的。

Original: https://blog.csdn.net/QLeelq/article/details/121800235
Author: 非晚非晚
Title: 一文掌握numpy数组的创建、索引和切片操作

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/762325/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球