日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

三维数组地址计算_科学计算NumPy

發布時間:2025/4/5 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 三维数组地址计算_科学计算NumPy 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

incipe

讀完需要

20分鐘

速讀僅需 7 分鐘

什么是 Numpy

?

NumPy 是一個運行速度非常快的數學庫,主要用于數組計算,包含:

  • 一個強大的 N 維數組對象 ndarray
  • 廣播功能函數
  • 整合 C/C++/Fortran 代碼的工具
  • 線性代數、傅里葉變換、隨機數生成等功能
?

使用

Ⅰ. 創建 ndarray

調用 array() 方法即可。

def?array(object,?dtype=None,?copy=True,?order='K',?subok=False,?ndmin=0)

參數:

  • object 數組或嵌套的數列。
  • dtype 數組元素的數據類型。
  • copy 對象是否需要復制。
  • order 創建數組的樣式,,C 為行方向,F 為列方向,A 原順序,K 元素在內存中的出現順序。
  • subok 默認返回一個與基類類型一致的數組。
  • ndmin 指定生成數組的最小維度。

還可以使用:

numpy.arange(12)?#?創建一個一維數組。
`#?array([?0,??1,??2,??3,??4,??5,??6,??7,??8,??9,?10,?11])`

numpy.arange(12).reshape(3,?4)??#?創建一個3行4列的數組。
"""
array([[?0,??1,??2,??3],
???????[?4,??5,??6,??7],
???????[?8,??9,?10,?11]])
"""

numpy.arange(12).reshape(2,?2,?3)?#?創建一個三維數組
"""
array([[[?0,??1,??2],
????????[?3,??4,??5]],
???????[[?6,??7,??8],
????????[?9,?10,?11]]])
"""

怎么理解三維數組,簡單的來說,我們把第一維看成數組分成了多少塊,第二維就是每塊有機房,第三維就是有幾列。

Ⅱ. 查看數據類型

調用方法 dtype 即可。

t1?=?np.arange(18).reshape(3,?3,?2)
t1.detype
"""
dtype('int64')
"""

更多數據類型請參考 numpy 中文網[1]

Ⅲ. 查看數組維度

調用 shape 方法即可。

import?numpy?as?np
t1?=?np.array([[1,?2,?3],?[4,?5,?6]])
t1.shape
#?(2,?3)

shape 方法給我們返回一個元組。

調用 reshape() 方法改變數組形狀。

t2?=?t1.reshape(3,?2)
"""
array([[1,?2],
???????[3,?4],
???????[5,?6]])
"""

調用 reshape() 方法后,原來的數組形狀是不變的,返回值返回變形后的新數組。

把數組轉化為一維數組。

t3?=?t2.flatten()
"""
array([1,?2,?3,?4,?5,?6])
"""

還可以用

t4?=?t2.reshape(6,)
"""
array([1,?2,?3,?4,?5,?6])
"""

或者

t5?=?t2.reshape(t2.shape[0]?*?t2.shape[1],?)
"""
array([1,?2,?3,?4,?5,?6])
"""

因為 shape 方法返回一個 tuple 所以第一個是行,第二個是列,行 × 列就是數組總個數。

轉換成二維,三維方法一樣 t.reshape(2, 3) 把數組 t 轉化為 2 行 3 列的數組。

Ⅳ. 數組的計算

數組與數字

數字和數組里面的每個數字相加、相減、相乘、相除。

t?=?np.array([[[1,?2,?3],?[4,?5,?6],?[7,?8,?9]]])
t?+=?2
"""
array([[[?3,??4,??5],
????????[?6,??7,??8],
????????[?9,?10,?11]]])
"""

注意,這里除 0,只會有警告,不會報錯。

t?=?np.array([0,?1,?2])
t?/=?0
#?array([nan,?inf,?inf])

這里的 nan 是由 0 除 0 產生的,即 not a number 不是一個數字

這里的 inf 是由其它數字除 0 產生的,即 無窮的意思。

數組與數組

  • 當數組形狀一樣的時候,加減乘除都是對應位置的元素進行計算。
  • t1?=?np.arange(12).reshape(3,?4)
    t2?=?np.arange(100,?112).reshape(3,?4)
    t1?+?t2
    """
    array([[100,?102,?104,?106],
    ???????[108,?110,?112,?114],
    ???????[116,?118,?120,?122]])
    """
  • 數組形狀不一樣時,如果兩個數組的后緣維度(從后面開始算起的維度)的軸長度相符或其中一方長度為 1 時,是廣播相容的。

    比如,(3, 4)和 (4,)是可以計算的;(2, 3, 4)和(1, 3, 4)是可以計算的。

  • t1?=?np.arange(12).reshape(3,?4)
    """
    array([[?0,??1,??2,??3],
    ???????[?4,??5,??6,??7],
    ???????[?8,??9,?10,?11]])
    """
    t3?=?np.arange(4)
    #?array([0,?1,?2,?3])
    t1?+?t3
    """
    array([[?0,??2,??4,??6],
    ???????[?4,??6,??8,?10],
    ???????[?8,?10,?12,?14]])
    """

    或者

    t1?=?np.arange(12).reshape(3,?4)
    """
    array([[?0,??1,??2,??3],
    ???????[?4,??5,??6,??7],
    ???????[?8,??9,?10,?11]])
    """
    t4?=?np.arange(3).reshape(3,?1)
    """
    array([[0],
    ???????[1],
    ???????[2]])
    """
    t1?+?t4
    """
    array([[?0,??1,??2,??3],
    ???????[?5,??6,??7,??8],
    ???????[10,?11,?12,?13]])
    """

    Ⅴ. 讀取數據

    這個功能用的不多,因為 pandas 太強了。

    import?numpy?as?np
    np.loadtxt(frame,?dtype=float,?comments='#',?delimiter=None,?converters=None,?skiprows=0,?usecols=None,?unpack=False,?ndmin=0,?encoding='bytes',?max_rows=None)

    參數:

    • frame 文件,字符串或者產生器,一般是文件的絕對路徑或者相對路徑。
    • dtype 數據類型、文件的字符串以什么數據類型讀入數組中。
    • comments 跳過文件中指定參數開頭的行。
    • delimiter 讀取文件中數據的分隔符。
    • converters 對讀取的數據進行預處理。
    • skiprows 選擇跳過的行數,一般跳過第一行表頭。
    • uescols 指定需要讀取的列。
    • unpack 如果為 True,讀入屬性將分別寫入不同數組變量,False 讀入數據只寫入一個數組變量。就是轉置的意思。
    • encoding 對讀取文件進行預編碼。
    • max_rows 最大讀取行數。

    Ⅵ. 數組的轉置

    一維數組不需要轉置。

    二維數組轉置

    import?numpy?as?np
    t1?=?np.arange(24).reshape(4,?6)
    t2?=?t1.T
    """
    array([[?0,??6,?12,?18],
    ???????[?1,??7,?13,?19],
    ???????[?2,??8,?14,?20],
    ???????[?3,??9,?15,?21],
    ???????[?4,?10,?16,?22],
    ???????[?5,?11,?17,?23]])
    """
    t3?=?t1.transpose()
    """
    array([[?0,??6,?12,?18],
    ???????[?1,??7,?13,?19],
    ???????[?2,??8,?14,?20],
    ???????[?3,??9,?15,?21],
    ???????[?4,?10,?16,?22],
    ???????[?5,?11,?17,?23]])
    """

    三維及三維以上。

    t4?=?np.arange(16).reshape(2,?2,?4)
    t4.transpose((1,?0,?2))
    """
    array([[[?0,??1,??2,??3],
    ????????[?8,??9,?10,?11]],
    ???????[[?4,??5,??6,??7],
    ????????[12,?13,?14,?15]]])
    """
    t4.swapaxes(1,?0)
    """
    array([[[?0,??1,??2,??3],
    ????????[?8,??9,?10,?11]],
    ???????[[?4,??5,??6,??7],
    ????????[12,?13,?14,?15]]])
    """

    transpose() 接受一個元組,原來的軸是 (0, 1, 2) 通過 transpose() 方法把原來的 0 軸變成了 1 軸。

    三維的數組的軸,就看成一個 xyz 坐標系即可。x 軸對應于 0 軸,y 軸對應于 1 軸,z 軸對應于 2 軸。

    Ⅶ. numpy 索引和切片

    取行

    import?numpy?as?np
    t?=?np.arange(24).reshape(4,?6)
    """
    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]])
    """
    t[1]?#?t[1,?:]
    """
    array([0,?1,?2,?3,?4,?5])
    """
    t[1::]?#?t[1::,?:]
    """
    array([[?6,??7,??8,??9,?10,?11],
    ???????[12,?13,?14,?15,?16,?17],
    ???????[18,?19,?20,?21,?22,?23]])
    """
    t[[1,?3]]?#?t[[1,?3],?:]
    """
    array([[?6,??7,??8,??9,?10,?11],
    ???????[18,?19,?20,?21,?22,?23]])
    """

    取列

    t[:,2]
    """
    array([?2,??8,?14,?20])
    """
    #?取列[:,2]前面的:不能省略,?表示所有行都要
    t[:,?2::]
    """
    array([[?2,??3,??4,??5],
    ???????[?8,??9,?10,?11],
    ???????[14,?15,?16,?17],
    ???????[20,?21,?22,?23]])
    """
    t[:,?[1,?2,?3]]
    """
    array([[?1,??2,??3],
    ???????[?7,??8,??9],
    ???????[13,?14,?15],
    ???????[19,?20,?21]])
    """

    同時取行和列

    t[2,3]
    #?15?表示取3行4列的元素
    t[1:3,2:5]
    """
    array([[?8,??9,?10],
    ???????[14,?15,?16]])
    """
    t[[0,?1,?2],?[2,?3,?4]]
    """
    array([?2,??9,?16])
    """

    Ⅷ. 修改數組值

    t?10
    """
    array([[?True,??True,??True,??True,??True,??True],
    ???????[?True,??True,??True,??True,?False,?False],
    ???????[False,?False,?False,?False,?False,?False],
    ???????[False,?False,?False,?False,?False,?False]])
    """
    t[t?10]?=?100
    """
    array([[100,?100,?100,?100,?100,?100],
    ???????[100,?100,?100,?100,??10,??11],
    ???????[?12,??13,??14,??15,??16,??17],
    ???????[?18,??19,??20,??21,??22,??23]])
    """
    t?=?np.arange(24).reshape(4,6)
    """
    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]])
    """
    np.where(t?10,?0,?100)
    """
    array([[??0,???0,???0,???0,???0,???0],
    ???????[??0,???0,???0,???0,?100,?100],
    ???????[100,?100,?100,?100,?100,?100],
    ???????[100,?100,?100,?100,?100,?100]])
    """
    t?=?np.arange(24).reshape(4,6)
    t.clip(10,?18)
    """
    array([[10,?10,?10,?10,?10,?10],
    ???????[10,?10,?10,?10,?10,?11],
    ???????[12,?13,?14,?15,?16,?17],
    ???????[18,?18,?18,?18,?18,?18]])
    小于10的替換成10,大于18的替換為18,不能替換nan
    """
    t?=?t.astype(float)
    """
    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.]])
    """
    t[3,?3]?=?np.nan
    """
    array([[?0.,??1.,??2.,??3.,??4.,??5.],
    ???????[?6.,??7.,??8.,??9.,?10.,?11.],
    ???????[12.,?13.,?14.,?15.,?16.,?17.],
    ???????[18.,?19.,?20.,?nan,?22.,?23.]])
    """
    t.clip(10,?18)
    """
    array([[10.,?10.,?10.,?10.,?10.,?10.],
    ???????[10.,?10.,?10.,?10.,?10.,?11.],
    ???????[12.,?13.,?14.,?15.,?16.,?17.],
    ???????[18.,?18.,?18.,?nan,?18.,?18.]])
    """

    Ⅸ. nan 特性

    兩個 nan 是不相等的。

    np.nan?==?np.nan
    #?False

    根據這個特性,判斷一個數組中有多少個 nan

    t
    """
    array([[?0.,??1.,??2.,??3.,??4.,??5.],
    ???????[?6.,??7.,??8.,??9.,?10.,?11.],
    ???????[12.,?13.,?14.,?15.,?16.,?17.],
    ???????[18.,?19.,?20.,?nan,?22.,?23.]])
    """
    np.count_nonzero(t!=t)
    #?1

    判斷一個數字是不是 nan

    np.isnan(t[3,?3])
    #?True
    np.isnan(t)
    """
    array([[False,?False,?False,?False,?False,?False],
    ???????[False,?False,?False,?False,?False,?False],
    ???????[False,?False,?False,?False,?False,?False],
    ???????[False,?False,?False,??True,?False,?False]])
    """
    t[np.isnan(t)]?=?0
    """
    array([[?0.,??1.,??2.,??3.,??4.,??5.],
    ???????[?6.,??7.,??8.,??9.,?10.,?11.],
    ???????[12.,?13.,?14.,?15.,?16.,?17.],
    ???????[18.,?19.,?20.,??0.,?22.,?23.]])
    """

    nan 與任何值計算都為 nan

    t
    """
    array([[?0.,??1.,??2.,??3.,??4.,??5.],
    ???????[?6.,??7.,??8.,??9.,?10.,?11.],
    ???????[12.,?13.,?14.,?15.,?16.,?17.],
    ???????[18.,?19.,?20.,?nan,?22.,?23.]])
    """
    t.sum()?#?np.sum(t)
    #?nan
    np.sum(t,?axis=0)
    """
    array([36.,?40.,?44.,?nan,?52.,?56.])
    """

    求和 np.sum() 方法里的參數 axis 表示軸的意思,一維數組一個軸,就是 0 二維數組兩個軸 0, 1 三維數組三個軸 0, 1, 2

    Ⅹ. numpy 中常用的統計函數

    • 求和 np.sum(a, axis=None)
    • 均值 np.mean(a, axis=None)
    • 中值 np.median(a, axis=None)
    • 最大值 np.max(a, axis=None)
    • 最小值 np.min(a, axis=None)
    • 極差 np.ptp(a, axis=None)
    • 標準差 np.sed(a, axis=None)

    標準差公式

    這里都只列舉的兩個參數,更多參數作用可以參考源代碼。

    Ⅺ. 數組的拼接

    豎直拼接

    t1?=?np.arange(24).reshape(4,?6)
    """
    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]])
    """
    t2?=?np.arange(24,?48).reshape(4,?6)
    """
    array([[24,?25,?26,?27,?28,?29],
    ???????[30,?31,?32,?33,?34,?35],
    ???????[36,?37,?38,?39,?40,?41],
    ???????[42,?43,?44,?45,?46,?47]])
    """
    np.vstack((t1,?t2))
    """
    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,?32,?33,?34,?35],
    ???????[36,?37,?38,?39,?40,?41],
    ???????[42,?43,?44,?45,?46,?47]])
    """

    水平拼接

    np.hstack((t1,?t2))
    """
    array([[?0,??1,??2,??3,??4,??5,?24,?25,?26,?27,?28,?29],
    ???????[?6,??7,??8,??9,?10,?11,?30,?31,?32,?33,?34,?35],
    ???????[12,?13,?14,?15,?16,?17,?36,?37,?38,?39,?40,?41],
    ???????[18,?19,?20,?21,?22,?23,?42,?43,?44,?45,?46,?47]])
    """

    XII. 其他方法

    • 獲取最大最小值位置,np.argmax(a, axis=None) np.argmin(a, axis=None)
    • 創建一個全為 0 的數組,np.zeros((行, 列))
    • 創建一個全為 1 的數組,np.ones((行, 列))
    • 創建一個對角線為 1 的正方形數組(方陣),np.eys(3)

    生成隨機數

    • np.random.rand(d0, d1, d2, ... , dn) n 維度均勻分布隨機數組,范圍 0 ~ 1
    • np.random.randn(d0, d1, d2, ... , dn) n 維度正態分布隨機數組,平均數 0,標準差 1
    • np.random.randint(low, high, (行, 列)) 范圍 [low, high)
    • np.random.uniform(low, high, (行, 列) 浮點數
    • np.random.normal(loc, scale, (行, 列)) 指定正態分布抽取樣本,分布中心 loc ,標準差 scale
    • np.random.seed() 隨機種子,c/c++常用操作 srand((unisgned)time(NULL))

    Reference

    [1]

    numpy 中文網: https://www.numpy.org.cn/user/basics/types.html#數組類型之間的轉換

    - END -

    總結

    以上是生活随笔為你收集整理的三维数组地址计算_科学计算NumPy的全部內容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。