Python-numpy数组元素的访问及数组的增删改查

ndarray数组元素的访问

  • 🌺 ndarray 切片操作的基本语法和列表类似,为 arr[start:stop:step],其中 star、stop 和 step 是可选参数。
  • 🌺 对于多维数组,每个维度都可以单独指定切片范围,语法为 arr[dim1_start:dim1_stop:dim1_step, dim2_start:dim2_stop:dim2_step, …]。
  • 🌺 start:切片起始索引,包含该索引对应的元素,默认值为 0。负数索引表示从数组末尾开始计数。
  • 🌺 stop:切片结束索引,不包含该索引对应的元素,默认值为数组的长度。负数索引表示从数组末尾开始计数。
  • 🌺 step:切片步长,默认值为 1。正数表示从左到右选取元素,负数表示从右到左选取元素。
  • 🌺 得到的结果仍是ndarray。

一维ndarray的元素访问

  • 🍁 0个冒号的,stop
code:
import numpy as np
nd1 = np.array(range(8))
print("nd1[3]: %d, nd1[-2]: %d" % (nd1[3], nd1[-2]))

result:
nd1[3]: 3, nd1[-2]: 6
  • 🍁 1个冒号的,start and stop
code:
import numpy as np
nd1 = np.array(range(8))
print("nd1[:3]: %s, nd1[2:4]: %s, nd1[4:]: %s, nd1[:]: %s" % (nd1[:3], nd1[2:4], nd1[4:], nd1[:]))

result:
nd1[:3]: [0 1 2], nd1[2:4]: [2 3], nd1[4:]: [4 5 6 7], nd1[:]: [0 1 2 3 4 5 6 7]
  • 🍁 2个冒号的,start,stop,step
code:
import numpy as np
nd1 = np.array(range(8))
import numpy as np
nd1 = np.array(range(8))
print("nd1[::3]: %s, nd1[2::4]: %s, nd1[:4:]: %s, nd1[:6:2]: %s,"% (nd1[::3], nd1[2::4], nd1[:4:], nd1[:6:2]))
print("nd1[2:5:]: %s,  nd1[1::]: %s, nd1[1:7:3]: %s, nd1[::]: %s" % (nd1[2:5:],  nd1[1::], nd1[1:7:3], nd1[::]))

result:
nd1[::3]: [0 3 6], nd1[2::4]: [2 6], nd1[:4:]: [0 1 2 3], nd1[:6:2]: [0 2 4],
nd1[2:5:]: [2 3 4],  nd1[1::]: [1 2 3 4 5 6 7], nd1[1:7:3]: [1 4], nd1[::]: [0 1 2 3 4 5 6 7]

二维ndarray的元素访问

  • 🌹访问单个元素,[行,列]指明要访问的元素的行列
code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6]])
print("nd1[1,2]: %s" % nd1[1, 2])

result:
nd1[1,2]: 6
  • 🌹[]访问一行或者多行
  • 🌹[]中一个数指行,有逗号,逗号前指行,后指列
  • 🌹行和列分别可以用切片,列表标识多行或者多列
code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("nd1[1]: %s", nd1[1])  # 一个参数指行
print("nd1[1, :]", nd1[1, :])  # 用中间逗号的方式指定行和列
print("nd1[0:2, :]", nd1[0:2, :])  # 用切片的方式指定多行
print("nd1[[0,1], :]", nd1[0:2, :])  # 用列表的方式指定多行

result:
nd1[1]: [4 5 6]
nd1[1, :]: [4 5 6]
nd1[0:2, :]: [[1 2 3]
 [4 5 6]]
nd1[[0,1], :]: [[1 2 3]
 [4 5 6]]
  • 🌹访问一列或者多列
  • 🌹访问某一列[:, 列号]
  • 🌹访问某一列[:, 切片或者列表]访问多列
code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
print("nd1[:, :]:", nd1[:, :])  # 所有行, 所有列
print("nd1[:, 1]:", nd1[:, 1])  # 第1列
print("nd1[1, 0:2]:", nd1[1, 0:2])  # 第一行的0列和1列
print("nd1[[0,1], [0, 2]]:", nd1[[0, 1], [0, 2]])  # 第一行的0列和1列

result:
nd1[:, :]: [[1 2 3]
 [4 5 6]
 [7 8 9]]
nd1[:, 1]: [2 5 8]
nd1[1, 0:2]: [4 5]
nd1[[0,1], [0, 2]]: [1 6]

ndarray数组元素的增删改查

ndarray数组元素的增加

np.append

-🌻np.append(arr, values, axis=None),values为要添加的数组,注意要和arr的shape匹配才能添加。

  • 🌻生成新的数据,原数据不变,values为要添加的数组,注意要和arr的shape匹配才能添加。
code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
nd2 = [[11, 22, 33]]  # 上下方向添加, 要是一行数据的形式
nd3 = [[44, 444], [55, 555], [66, 666]]
new_nd1 = np.append(nd1, nd2, axis=0)  # 上下方向添加
print(new_nd1)
new_nd2 = np.append(nd1, nd3, axis=1)  # 左右方向添加
print(new_nd2)

result:
[[ 1  2  3]
 [ 4  5  6]
 [ 7  8  9]
 [11 22 33]]
[[  1   2   3  44 444]
 [  4   5   6  55 555]
 [  7   8   9  66 666]]

np.insert

-🌻 np.insert() 函数可以在数组的指定位置插入值,返回一个新的数组。
-🌻 np.insert(arr, obj, values, axis=None)

code:
import numpy as np
nd1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
# insert(arr, obj, values, axis=None)
nd2 = np.insert(nd1, 1, [11, 22, 33], axis=0)
nd3 = np.insert(nd2, 3, [[44, 55, 66]], axis=0)
nd4 = np.insert(nd1, 1, [11, 22, 33], axis=1)
nd5 = np.insert(nd4, 3, [[44, 55, 66]], axis=1)
print("nd3:\n", nd3)
print("nd5:\n", nd5)

result:
nd3:
 [[ 1  2  3]
 [11 22 33]
 [ 4  5  6]
 [44 55 66]
 [ 7  8  9]]
nd5:
 [[ 1 11  2 44  3]
 [ 4 22  5 55  6]
 [ 7 33  8 66  9]]

np.concatenate

  • 🪻 np.concatenate() 函数可以将多个数组沿着指定的轴连接在一起,实现数据的合并。
  • 🪻返回一个新的数组,原数组不会被修改。
code:
import numpy as np

# 一维数组拼接
arr_1d_1 = np.array([1, 2, 3])
arr_1d_2 = np.array([4, 5, 6])
new_arr_1d = np.concatenate((arr_1d_1, arr_1d_2))  # 一维数字组拼接不用指定axis
print("一维数组拼接后的结果:", new_arr_1d)

# 二维数组拼接
arr_2d_1 = np.array([[1, 2], [3, 4]])
arr_2d_2 = np.array([[5, 6], [7, 8]])
# 垂直拼接
new_arr_2d_vertical = np.concatenate((arr_2d_1, arr_2d_2), axis=0)  # 垂直方向上拼接
print("\n二维数组垂直拼接后的结果:")
print(new_arr_2d_vertical)
# 水平拼接
new_arr_2d_horizontal = np.concatenate((arr_2d_1, arr_2d_2), axis=1)  # 水平方向上拼接
print("\n二维数组水平拼接后的结果:")
print(new_arr_2d_horizontal)

result:
一维数组拼接后的结果: [1 2 3 4 5 6]

二维数组垂直拼接后的结果:
[[1 2]
 [3 4]
 [5 6]
 [7 8]]

二维数组水平拼接后的结果:
[[1 2 5 6]
 [3 4 7 8]]

np.hstack和np.vstack

  • ☘️ np.hstack(tup1,tup2,…),注意参数的类型。
  • ☘️ 参数tup是一个元组、列表或其他可迭代对象,其中包含了要进行水平拼接的多个数组。
  • ☘️ np.vstack(tup1,tup2),和np.hstack不同的是拼接的方向不同。
code:
import numpy as np
nd1 = np.array([[1, 2], [3, 4], [5, 6]])
nd2 = np.array([[11, 22], [33, 44], [55, 66]])
print("hstack: ", np.hstack((nd1, nd2)))
print("vstack: ", np.vstack((nd1, nd2)))

result:
hstack:  [[ 1  2 11 22]
 [ 3  4 33 44]
 [ 5  6 55 66]]
vstack:  [[ 1  2]
 [ 3  4]
 [ 5  6]
 [11 22]
 [33 44]
 [55 66]]

ndarray数组元素的删除

np.delete()删除指定位置的元素

-🪻 NumPy 数组是固定大小的,直接删除元素通常会创建一个新数组。
-🪻 删除一维数组元素,np.delete(arr1, idx),指定位置为idx。
-🪻 删除二维数组元素,np.delete(arr1, idx, axis=0/1),指定位置为idx,按行或者列要指定axis。

code:
import numpy as np

arr1 = np.array(range(5))
arr2 = np.delete(arr1, [0,4])
arr3 = np.delete(arr1, 2)
print(arr1)
print(arr2)
print(arr3)

result:
import numpy as np

arr1 = np.array(range(5))
arr2 = np.delete(arr1, [0,4])
arr3 = np.delete(arr1, 2)
print(arr1)
print(arr2)
print(arr3)
code:
arr1 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr2 = np.delete(arr1, 1, axis=0)  # 删除第2行(索引1)
arr3 = np.delete(arr1, [1,2], axis=0)  # 删除第2行(索引1)
print("arr1:\n",arr1)
print("arr2:\n",arr2)
print("arr3:\n",arr3)

result:
arr1:
 [[1 2 3]
 [4 5 6]
 [7 8 9]]
arr2:
 [[1 2 3]
 [7 8 9]]
arr3:
 [[1 2 3]]

根据条件删除元素(过滤)

  • 🍅 使用布尔索引创建符合条件的新数组
  • 🍅 类似于(arr1>1) & (arr1<5)的表达式生成一个布尔数组。
code:
import numpy as np

arr1 = np.array([1, 2, 3, 4, 5, 6])
condition = (arr1>1) & (arr1<5)
arr2 = arr1[condition]
print("arr1\n", arr1)
print(condition)
print("arr2\n", arr2)

result:
arr1
 [1 2 3 4 5 6]
[False  True  True  True False False]
arr2
 [2 3 4]

np.unique删除重复元素

  • 🍉 删除重复元素,并重新排序
code:
import numpy as np

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

result:
<class 'numpy.ndarray'> [1 2 3 4 5]

修改ndarray中的元素

直接索引赋值

  • 💖 支持一维和多维
code:
import numpy as np

arr1 = np.array([10, 20, 30, 40])
arr1[2] = 300
arr1[-1] = 400
print("arr1:\n", arr1)

arr2 = np.array([[1, 2], [3, 4]])
arr2[0, 1] = 20
print("arr2:\n", arr2)

result:
arr1:
 [ 10  20 300 400]
arr2:
 [[ 1 20]
 [ 3  4]]

切片赋值

  • 💖 通过切片选择多个元素,批量修改值。
  • 💖 赋值时需要确保右侧值的形状与切片形状兼容。
code:
import numpy as np

arr1 = np.array([1, 2, 3, 4, 5])
arr1[1:4] = [20, 30, 40]
print("arr1:\n", arr1)

arr2 = np.array([1, 2, 3, 4, 5])
arr2[1:4] = 0  # 赋值为同一个数
print("arr2:\n", arr2)

arr3 = np.array([[1, 2, 3], [4, 5, 6], [7, 8, 9]])
arr3[:, 2] = [20, 50, 80]  # 修改第2列
print("arr3:\n", arr3)

result:
arr1:
 [ 1 20 30 40  5]
arr2:
 [1 0 0 0 5]
arr3:
 [[ 1  2 20]
 [ 4  5 50]
 [ 7  8 80]]

布尔索引赋值

  • 💞 通过布尔掩码选择符合条件的元素,批量修改。
code:
import numpy as np

arr1 = np.array([1, 2, 6, 4, 10, 5, 8])
arr1[(arr1 > 3) & (arr1 < 8) ] = 0
print("arr1:\n", arr1)

result:
arr1:
 [ 1  2  0  0 10  0  8]

使用 np.put() 按索引批量赋值

-💘 np.put(arr, [索引],[对应索引的修改值])

code:
import numpy as np

arr = np.array([10, 20, 30, 40, 50])
np.put(arr, [0, 2, 4], [100, 300, 500])  # 修改索引0、2、4的元素
print(arr)

result:
[100  20 300  40 500]

使用 np.where() 条件替换

-☘️ np.where(condition),返回满足条件的元素的索引。

code:
import numpy as np
arr1 = np.array([1, 2, 3, 4, 5, 6])
indices = np.where(arr1 > 3)
print("indices:\n", indices)
print("arr1[indices]:\n", arr1[indices])

# np.where对于二维数组, 返回的是行索引和列索引列表, 满足条件的是2, 3,4这两个元素, 即为
# arr2[0,1], arr2[1,0], arr2[1,1],它们行索引形成[0,1,1], 列索引形成[1,0,1]
arr2 = np.array([[1, 2], [3, 4]])
row_idx, col_idx = np.where(arr2 > 1)
print(f"row_idx:{row_idx}, col_idx: {col_idx}")

result:
indices:
 (array([3, 4, 5], dtype=int64),)
arr1[indices]:
 [4 5 6]
row_idx:[0 1 1], col_idx: [1 0 1]

-☘️ np.where(condition, x, y),当 condition 为 True 时,取 x 的值,否则取y的值。
-☘️ 算是3目运算符。

code:
import numpy as np

dt = np.dtype([
    ('name', 'U3'),  # Unicode字符串,最大长度3
    ('age', np.int32),
    ('height', float)
])
arr = np.array([
    ('Alice', 25, 1.65),
    ('Bob', 30, 1.80),
    ('Charlie', 22, 1.75)
], dtype=dt)
print(arr)
print(arr[0]["name"])
print(arr["age"])

result:
[('Ali', 25, 1.65) ('Bob', 30, 1.8 ) ('Cha', 22, 1.75)]
Ali
[25 30 22]

修改为特殊值

  • 🏵️ 如果要赋值为nan,必须dtarray为float型,先要进行数据类型的转换。

numpy中的裁剪函数Clip

  • 🌺Clip函数用于将数组中的元素限制在指定的最小值和最大值之间。
  • 🌺 np.clip(arr, a_min, a_max, out=None), arr:输入的数组。a_min:最小值(低于此值的元素将被替换为 a_min, a_max:最大值(高于此值的元素将被替换为 a_max)。
    out(可选):指定输出结果的数组,如果指定为arr,相当于原地修改,若不提供则返回新数组。
code:
import numpy as np

arr2d = np.array([[1, 5], [10, 15]])
clipped = np.clip(arr2d, 3, 12, out=arr2d)
print(clipped)
print(arr2d)

result:
[[ 3  5]
 [10 12]]
[[ 3  5]
 [10 12]]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值