Numpy_1:创建-算术-切片索引-布尔索引-神奇索引-转置与内积

本文介绍了如何使用Numpy进行数值计算,包括数组创建、基本属性查看、全0/1数组、类型转换、算术运算、布尔索引以及切片和索引技巧。通过实例演示了如何高效地操作数组并理解其核心概念。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

Numpy

  • 可以像标量计算一样计算数组
  • 在一个ndarray里,每一个元素都是相同类型
  • 每一个数组都有一个属性shape,dtype,ndim
import numpy as np

创建Numpy

data1 = [6, 7.5, 8, 0, 1]
arr1 = np.array(data1)
arr1
array([6., 7.5, 8., 0., 1.])
print(arr1.shape)
print(arr1.ndim)
print(arr1.dtype)
(5,)
1
float64

全0 / 全1 / 全空(垃圾值)

zero_2_3 = np.zeros((2, 3))
print(zero_2_3)
[[0. 0. 0.]
 [0. 0. 0.]]
one_1_3 = np.ones((1, 3))
print(one_1_3)
[[1. 1. 1.]]
empty_2_3_2 = np.empty((2, 3, 2))
print(empty_2_3_2)
[[[3.10503618e+231 3.10503618e+231]
  [1.03753786e-322 0.00000000e+000]
  [0.00000000e+000 0.00000000e+000]]

 [[0.00000000e+000 0.00000000e+000]
  [0.00000000e+000 0.00000000e+000]
  [0.00000000e+000 0.00000000e+000]]]

np.arange( )

  • 数组版range( )
arange_ = np.arange(10)
print(arange_)
[0 1 2 3 4 5 6 7 8 9]

数组的类型变化

  • np.astype( )
  • 可以将string变成numeric
num_strings = np.array(['1.25', '-9.6', '42'], dtype=np.string_)
num_strings = num_strings.astype(float)
num_strings
array([ 1.25, -9.6 , 42.  ])

Numpy的数组算数

  • 任何两个等尺寸的数组之间的算术操作都是逐元素
  • 带有标量的,都会操作与每一个元素,例如1/M
  • 同尺寸数组比较,就是bool操作,也会逐个比较
arr = np.array([[1, 2, 3], [4, 5, 6]])
arr * arr
array([[ 1,  4,  9],
       [16, 25, 36]])
arr - arr
arr ** arr
arr / arr
1 / arr
arr ** 0.5
array([[1.        , 1.41421356, 1.73205081],
       [2.        , 2.23606798, 2.44948974]])
arr2 = np.array([[2, 1, 6],[3, 0, 2]])
arr2 > arr
array([[ True, False,  True],
       [False, False, False]])

索引与切片

  • 切片被切出来以后,是一个视图,就是俗话说的指针,改变切出来的值也会改变原来的变量
  • 若真的想要一个拷贝,而不是一个视图,就需要使用.copy()

切片

arr3 = np.array([1, 2, 3, 4, 5, 6, 7])
arr3
array([1, 2, 3, 4, 5, 6, 7])
arr3_slice = arr3[2:5]
arr3_slice
array([3, 4, 5])
arr3_slice[1] = 100
print(arr3_slice)
print(arr3)
[  3 100   5]
[  1   2   3 100   5   6   7]
arr3[4:6] = 99
print(arr3)
print(arr3_slice)
[  1   2   3 100  99  99   7]
[  3 100  99]
# .copy()
arr3_copy = arr3[3:5].copy()
arr3_copy
array([100,  99])

索引

arr_2d = np.array([[1, 2, 3], [4, 5, 6]])
# 两种方式都可以
print(arr_2d[0][1])
print(arr_2d[1, 0])
2
4

索引 + 切片

empty_2_3_2
array([[[3.10503618e+231, 3.10503618e+231],
        [1.03753786e-322, 0.00000000e+000],
        [0.00000000e+000, 0.00000000e+000]],

       [[0.00000000e+000, 0.00000000e+000],
        [0.00000000e+000, 0.00000000e+000],
        [0.00000000e+000, 0.00000000e+000]]])
empty_slice_index = empty_2_3_2[0,0:2]
empty_slice_index
array([[3.10503618e+231, 3.10503618e+231],
       [1.03753786e-322, 0.00000000e+000]])

BOOL索引

names = np.array(['Bob', 'Joe', 'Will', 'Bob', 'Will', 'Joe', 'Joe'])
data = np.random.randn(7, 4)
print(names)
print(data)
['Bob' 'Joe' 'Will' 'Bob' 'Will' 'Joe' 'Joe']
[[-0.76653514  0.1674464   2.04743708  0.80417589]
 [ 0.94516431 -1.45891232 -0.49894545  1.13276983]
 [ 0.52359465  0.52882966  0.10846199 -0.31576578]
 [ 1.72629058  0.30659678  0.30496955  0.19905612]
 [ 1.11259468  1.07077902 -0.48850304 -0.62000457]
 [ 0.85144135 -0.0565551  -1.35784127  0.03526461]
 [ 0.26994239 -0.04985369 -1.13525461 -0.62994759]]
names == 'Bob'
array([ True, False, False,  True, False, False, False])
data[names == 'Bob', 2:]
array([[2.04743708, 0.80417589],
       [0.30496955, 0.19905612]])
data[names == 'Bob', 3]
array([0.80417589, 0.19905612])

神奇索引

arr = np.empty((8, 4))
for i in range(8):
    # 一次变一行
    arr[i] = i
arr
array([[0., 0., 0., 0.],
       [1., 1., 1., 1.],
       [2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [4., 4., 4., 4.],
       [5., 5., 5., 5.],
       [6., 6., 6., 6.],
       [7., 7., 7., 7.]])

开始索引

magic_1 = arr[[2, 3, 5]]
magic_1
array([[2., 2., 2., 2.],
       [3., 3., 3., 3.],
       [5., 5., 5., 5.]])
magic_2 = arr[[-1, -4, -6]]
magic_2
array([[7., 7., 7., 7.],
       [4., 4., 4., 4.],
       [2., 2., 2., 2.]])

当面临多维时

arr = np.arange(32).reshape((8, 4))
array([[ 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]])
magic_3 = arr[[2, 3, 6],[1, 3, 2]]
magic_3
array([2., 3., 6.])

转置和内积

  • np.dot
  • np.T
arr = np.arange(15).reshape((5, 3))
arr
array([[ 0,  1,  2],
       [ 3,  4,  5],
       [ 6,  7,  8],
       [ 9, 10, 11],
       [12, 13, 14]])
arr_T = arr.T
arr_T
array([[ 0,  3,  6,  9, 12],
       [ 1,  4,  7, 10, 13],
       [ 2,  5,  8, 11, 14]])
Dot = np.dot(arr_T, arr)
Dot
array([[270, 300, 330],
       [300, 335, 370],
       [330, 370, 410]])
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值