首頁  >  文章  >  後端開發  >  用 NumPy 在 Python 中處理數字

用 NumPy 在 Python 中處理數字

WBOY
WBOY轉載
2023-04-15 17:55:031472瀏覽

用 NumPy 在 Python 中處理數字

這篇文章討論了安裝 NumPy,然後建立、讀取和排序 NumPy 陣列。

NumPy(即 Numerical Python)是一個函式庫,它使得在Python 中對線性數列和矩陣進行統計和集合運算變得容易。 我在 Python 資料類型的筆記中介紹過,它比 Python 的清單快幾個數量級。 NumPy 在數據分析和科學計算中使用得相當頻繁。

我將介紹安裝 NumPy,然後建立、讀取和排序 NumPy 陣列。 NumPy 陣列也被稱為 ndarray,即 N 維數組的縮寫。

安裝NumPy

使用 pip 安裝NumPy 套件非常簡單,可以像安裝其他軟體套件一樣進行安裝:

<ol><li><code><span>pip install numpy</span></code></li></ol>

安裝了NumPy 套件後,只需將其導入你的Python 文件中:

<ol><li><code><span>import</span><span> numpy </span><span>as</span><span> np</span></code></li></ol>

將 numpy 以 np 之名導入是一個標準的慣例,但你可以不使用 np,而是使用你想要的任何其他別名。

為什麼使用 NumPy? 因為它比 Python 列表要快好幾個數量級

#當涉及到處理大量的數值時,NumPy 比普通的 Python 列表快幾個數量級。為了看看它到底有多快,我首先測量在普通 Python 清單上進行 min() 和 max() 操作的時間。

我將首先建立一個具有999,999,999 項的Python 清單:

<ol>
<li><code><span>>>></span><span> my_list </span><span>=</span><span> range</span><span>(</span><span>1</span><span>,</span><span> </span><span>1000000000</span><span>)</span></code></li>
<li><code><span>>>></span><span> len</span><span>(</span><span>my_list</span><span>)</span></code></li>
<li><code><span>999999999</span></code></li>
</ol>

現在我將測量在這個清單中找到最小值的時間:

<ol>
<li><code><span>>>></span><span> start </span><span>=</span><span> </span><span>time</span><span>.</span><span>time</span><span>()</span></code></li>
<li><code><span>>>></span><span> min</span><span>(</span><span>my_list</span><span>)</span></code></li>
<li><code><span>1</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>'Time elapsed in milliseconds: '</span><span> </span><span>+</span><span> str</span><span>((</span><span>time</span><span>.</span><span>time</span><span>()</span><span> </span><span>-</span><span> start</span><span>)</span><span> </span><span>*</span><span> </span><span>1000</span><span>))</span></code></li>
<li><code><span>Time</span><span> elapsed </span><span>in</span><span> milliseconds</span><span>:</span><span> </span><span>27007.00879096985</span></code></li>
</ol>

這花了大約27,007 毫秒,也就是大約 27 秒。這是個很長的時間。現在我試著找出尋找最大值的時間:

<ol>
<li><code><span>>>></span><span> start </span><span>=</span><span> </span><span>time</span><span>.</span><span>time</span><span>()</span></code></li>
<li><code><span>>>></span><span> max</span><span>(</span><span>my_list</span><span>)</span></code></li>
<li><code><span>999999999</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>'Time elapsed in milliseconds: '</span><span> </span><span>+</span><span> str</span><span>((</span><span>time</span><span>.</span><span>time</span><span>()</span><span> </span><span>-</span><span> start</span><span>)</span><span> </span><span>*</span><span> </span><span>1000</span><span>))</span></code></li>
<li><code><span>Time</span><span> elapsed </span><span>in</span><span> milliseconds</span><span>:</span><span> </span><span>28111.071348190308</span></code></li>
</ol>

這花了大約 28,111 毫秒,也就是大約 28 秒

現在我試試用 NumPy 找到最小值和最大值的時間:

<ol>
<li><code><span>>>></span><span> my_list </span><span>=</span><span> np</span><span>.</span><span>arange</span><span>(</span><span>1</span><span>,</span><span> </span><span>1000000000</span><span>)</span></code></li>
<li><code><span>>>></span><span> len</span><span>(</span><span>my_list</span><span>)</span></code></li>
<li><code><span>999999999</span></code></li>
<li><code><span>>>></span><span> start </span><span>=</span><span> </span><span>time</span><span>.</span><span>time</span><span>()</span></code></li>
<li><code><span>>>></span><span> my_list</span><span>.</span><span>min</span><span>()</span></code></li>
<li><code><span>1</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>'Time elapsed in milliseconds: '</span><span> </span><span>+</span><span> str</span><span>((</span><span>time</span><span>.</span><span>time</span><span>()</span><span> </span><span>-</span><span> start</span><span>)</span><span> </span><span>*</span><span> </span><span>1000</span><span>))</span></code></li>
<li><code><span>Time</span><span> elapsed </span><span>in</span><span> milliseconds</span><span>:</span><span> </span><span>1151.1778831481934</span></code></li>
<li><code><span>>>></span></code></li>
<li><code><span>>>></span><span> start </span><span>=</span><span> </span><span>time</span><span>.</span><span>time</span><span>()</span></code></li>
<li><code><span>>>></span><span> my_list</span><span>.</span><span>max</span><span>()</span></code></li>
<li><code><span>999999999</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>'Time elapsed in milliseconds: '</span><span> </span><span>+</span><span> str</span><span>((</span><span>time</span><span>.</span><span>time</span><span>()</span><span> </span><span>-</span><span> start</span><span>)</span><span> </span><span>*</span><span> </span><span>1000</span><span>))</span></code></li>
<li><code><span>Time</span><span> elapsed </span><span>in</span><span> milliseconds</span><span>:</span><span> </span><span>1114.8970127105713</span></code></li>
</ol>

找到最小值花了大約 1151 毫秒,找到最大值 1114 毫秒。這大約是 1 秒

正如你所看到的,使用 NumPy 可以將尋找一個大約有 10 億個值的列表的最小值和最大值的時間 從大約 28 秒減少到 1 秒。這就是 NumPy 的強大之處。

使用 Python 清單建立 ndarray

有幾種方法可以在 NumPy 中建立 ndarray。

你可以透過使用元素清單來建立一個 ndarray:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>5</span><span>])</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span>1</span><span> </span><span>2</span><span> </span><span>3</span><span> </span><span>4</span><span> </span><span>5</span><span>]</span></code></li>
</ol>

有了上面的 ndarray 定義,我會檢查幾件事。首先,上面定義的變數的型別是 numpy.ndarray。這是所有 NumPy ndarray 的類型:

<ol>
<li><code><span>>>></span><span> type</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span><span>class</span><span> </span><span>'numpy.ndarray'</span><span>></span></span></code></li>
</ol>

這裡要注意的另一件事是 “形狀shape”。 ndarray 的形狀是 ndarray 的每個維度的長度。你可以看到,my_ndarray 的形狀是 (5,)。這表示 my_ndarray 包含一個有 5 個元素的維度(軸)。

<ol>
<li><code><span>>>></span><span> np</span><span>.</span><span>shape</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>(</span><span>5</span><span>,)</span></code></li>
</ol>

陣列中的維數被稱為它的 “rank”。所以上面的 ndarray 的秩是 1。

我將定義另一個 ndarray my_ndarray2 作為一個多維 ndarray。那麼它的形狀會是什麼呢?請看下面:

<ol>
<li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([(</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>(</span><span>4</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>6</span><span>)])</span></code></li>
<li><code><span>>>></span><span> np</span><span>.</span><span>shape</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li>
<li><code><span>(</span><span>2</span><span>,</span><span> </span><span>3</span><span>)</span></code></li>
</ol>

這是一個秩為 2 的 ndarray。另一個要檢查的屬性是 dtype,也就是資料型態。檢查我們的 ndarray 的 dtype 可以得到以下結果:

<ol>
<li><code><span>>>></span><span> my_ndarray</span><span>.</span><span>dtype</span></code></li>
<li><code><span>dtype</span><span>(</span><span>'int64'</span><span>)</span></code></li>
</ol>

int64 意味著我們的 ndarray 是由 64 位元整數組成的。 NumPy 不能建立混合類型的 ndarray,必須只包含一種類型的元素。如果你定義了一個包含混合元素類型的 ndarray,NumPy 會自動將所有的元素類型轉換為可以包含所有元素的最高元素類型。

例如,建立一個 int 和 float 的混合序列將建立一個 float64 的ndarray:

<ol>
<li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2.0</span><span>,</span><span> </span><span>3</span><span>])</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li>
<li><code><span>[</span><span>1.</span><span> </span><span>2.</span><span> </span><span>3.</span><span>]</span></code></li>
<li><code><span>>>></span><span> my_ndarray2</span><span>.</span><span>dtype</span></code></li>
<li><code><span>dtype</span><span>(</span><span>'float64'</span><span>)</span></code></li>
</ol>

另外,將其中一個元素設為 string 將建立 dtype 等於 <u21> 的字串ndarray,表示我們的ndarray 包含unicode 字串:</u21>

<ol>
<li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>'2'</span><span>,</span><span> </span><span>3</span><span>])</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li>
<li><code><span>[</span><span>'1'</span><span> </span><span>'2'</span><span> </span><span>'3'</span><span>]</span></code></li>
<li><code><span>>>></span><span> my_ndarray2</span><span>.</span><span>dtype</span></code></li>
<li><code><span>dtype</span><span>(</span><span>'<u21><span>)</span></u21></span></code></li>
</ol>

size 屬性將顯示我們的ndarray 中存在的元素總數:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>5</span><span>])</span></code></li>
<li><code><span>>>></span><span> my_ndarray</span><span>.</span><span>size</span></code></li>
<li><code><span>5</span></code></li>
</ol>

使用NumPy 方法建立ndarray

如果你不想直接使用清單來建立ndarray,還有幾種可以用來創建它的NumPy 方法。

你可以用 np.zeros() 來建立一個填滿 0 的 ndarray。它需要一個「形狀」作為參數,這是一個包含行數和列數的清單。它也可以接受一個可選的 dtype 參數,這是 ndarray 的資料類型:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>zeros</span><span>([</span><span>2</span><span>,</span><span>3</span><span>],</span><span> dtype</span><span>=</span><span>int</span><span>)</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[[</span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span>0</span><span> </span><span>0</span><span> </span><span>0</span><span>]]</span></code></li>
</ol>

你可以使用 np. ones() 来创建一个填满 1 的 ndarray:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>ones</span><span>([</span><span>2</span><span>,</span><span>3</span><span>],</span><span> dtype</span><span>=</span><span>int</span><span>)</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[[</span><span>1</span><span> </span><span>1</span><span> </span><span>1</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span>1</span><span> </span><span>1</span><span> </span><span>1</span><span>]]</span></code></li>
</ol>

你可以使用 np.full() 来给 ndarray 填充一个特定的值:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>full</span><span>([</span><span>2</span><span>,</span><span>3</span><span>],</span><span> </span><span>10</span><span>,</span><span> dtype</span><span>=</span><span>int</span><span>)</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[[</span><span>10</span><span> </span><span>10</span><span> </span><span>10</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span>10</span><span> </span><span>10</span><span> </span><span>10</span><span>]]</span></code></li>
</ol>

你可以使用 np.eye() 来创建一个单位矩阵 / ndarray,这是一个沿主对角线都是 1 的正方形矩阵。正方形矩阵是一个行数和列数相同的矩阵:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>eye</span><span>(</span><span>3</span><span>,</span><span> dtype</span><span>=</span><span>int</span><span>)</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[[</span><span>1</span><span> </span><span>0</span><span> </span><span>0</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span>0</span><span> </span><span>1</span><span> </span><span>0</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span>0</span><span> </span><span>0</span><span> </span><span>1</span><span>]]</span></code></li>
</ol>

你可以使用 np.diag() 来创建一个沿对角线有指定数值的矩阵,而在矩阵的其他部分为 0

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>diag</span><span>([</span><span>10</span><span>,</span><span> </span><span>20</span><span>,</span><span> </span><span>30</span><span>,</span><span> </span><span>40</span><span>,</span><span> </span><span>50</span><span>])</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[[</span><span>10</span><span></span><span>0</span><span></span><span>0</span><span></span><span>0</span><span></span><span>0</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span> </span><span>0</span><span> </span><span>20</span><span></span><span>0</span><span></span><span>0</span><span></span><span>0</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span> </span><span>0</span><span></span><span>0</span><span> </span><span>30</span><span></span><span>0</span><span></span><span>0</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span> </span><span>0</span><span></span><span>0</span><span></span><span>0</span><span> </span><span>40</span><span></span><span>0</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span> </span><span>0</span><span></span><span>0</span><span></span><span>0</span><span></span><span>0</span><span> </span><span>50</span><span>]]</span></code></li>
</ol>

你可以使用 np.range() 来创建一个具有特定数值范围的 ndarray。它是通过指定一个整数的开始和结束(不包括)范围以及一个步长来创建的:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>arange</span><span>(</span><span>1</span><span>,</span><span> </span><span>20</span><span>,</span><span> </span><span>3</span><span>)</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span> </span><span>1</span><span></span><span>4</span><span></span><span>7</span><span> </span><span>10</span><span> </span><span>13</span><span> </span><span>16</span><span> </span><span>19</span><span>]</span></code></li>
</ol>

读取 ndarray

ndarray 的值可以使用索引、分片或布尔索引来读取。

使用索引读取 ndarray 的值

在索引中,你可以使用 ndarray 的元素的整数索引来读取数值,就像你读取 Python 列表一样。就像 Python 列表一样,索引从 0 开始。

例如,在定义如下的 ndarray 中:

<ol><li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>arange</span><span>(</span><span>1</span><span>,</span><span> </span><span>20</span><span>,</span><span> </span><span>3</span><span>)</span></code></li></ol>

第四个值将是 my_ndarray[3],即 10。最后一个值是 my_ndarray[-1],即 19

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>arange</span><span>(</span><span>1</span><span>,</span><span> </span><span>20</span><span>,</span><span> </span><span>3</span><span>)</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>0</span><span>])</span></code></li>
<li><code><span>1</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>3</span><span>])</span></code></li>
<li><code><span>10</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[-</span><span>1</span><span>])</span></code></li>
<li><code><span>19</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>5</span><span>])</span></code></li>
<li><code><span>16</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>6</span><span>])</span></code></li>
<li><code><span>19</span></code></li>
</ol>

使用分片读取 ndarray

你也可以使用分片来读取 ndarray 的块。分片的工作方式是用冒号(:)操作符指定一个开始索引和一个结束索引。然后,Python 将获取该开始和结束索引之间的 ndarray 片断:

<ol>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[:])</span></code></li>
<li><code><span>[</span><span> </span><span>1</span><span></span><span>4</span><span></span><span>7</span><span> </span><span>10</span><span> </span><span>13</span><span> </span><span>16</span><span> </span><span>19</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>2</span><span>:</span><span>4</span><span>])</span></code></li>
<li><code><span>[</span><span> </span><span>7</span><span> </span><span>10</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>5</span><span>:</span><span>6</span><span>])</span></code></li>
<li><code><span>[</span><span>16</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[</span><span>6</span><span>:</span><span>7</span><span>])</span></code></li>
<li><code><span>[</span><span>19</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[:-</span><span>1</span><span>])</span></code></li>
<li><code><span>[</span><span> </span><span>1</span><span></span><span>4</span><span></span><span>7</span><span> </span><span>10</span><span> </span><span>13</span><span> </span><span>16</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>[-</span><span>1</span><span>:])</span></code></li>
<li><code><span>[</span><span>19</span><span>]</span></code></li>
</ol>

分片创建了一个 ndarray 的引用(或视图)。这意味着,修改分片中的值也会改变原始 ndarray 的值。

比如说:

<ol>
<li><code><span>>>></span><span> my_ndarray</span><span>[-</span><span>1</span><span>:]</span><span> </span><span>=</span><span> </span><span>100</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span></span><span>1</span><span> </span><span>4</span><span> </span><span>7</span><span></span><span>10</span><span></span><span>13</span><span></span><span>16</span><span> </span><span>100</span><span>]</span></code></li>
</ol>

对于秩超过 1 的 ndarray 的分片,可以使用 [行开始索引:行结束索引, 列开始索引:列结束索引] 语法:

<ol>
<li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([(</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>),</span><span> </span><span>(</span><span>4</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>6</span><span>)])</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li>
<li><code><span>[[</span><span>1</span><span> </span><span>2</span><span> </span><span>3</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span>4</span><span> </span><span>5</span><span> </span><span>6</span><span>]]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>[</span><span>0</span><span>:</span><span>2</span><span>,</span><span>1</span><span>:</span><span>3</span><span>])</span></code></li>
<li><code><span>[[</span><span>2</span><span> </span><span>3</span><span>]</span></code></li>
<li><code><span> </span><span>[</span><span>5</span><span> </span><span>6</span><span>]]</span></code></li>
</ol>

使用布尔索引读取 ndarray 的方法

读取 ndarray 的另一种方法是使用布尔索引。在这种方法中,你在方括号内指定一个过滤条件,然后返回符合该条件的 ndarray 的一个部分。

例如,为了获得一个 ndarray 中所有大于 5 的值,你可以指定布尔索引操作 my_ndarray[my_ndarray > 5]。这个操作将返回一个包含所有大于 5 的值的 ndarray:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>6</span><span>,</span><span> </span><span>7</span><span>,</span><span> </span><span>8</span><span>,</span><span> </span><span>9</span><span>,</span><span> </span><span>10</span><span>])</span></code></li>
<li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> my_ndarray</span><span>[</span><span>my_ndarray </span><span>></span><span> </span><span>5</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li>
<li><code><span>[</span><span> </span><span>6</span><span></span><span>7</span><span></span><span>8</span><span></span><span>9</span><span> </span><span>10</span><span>]</span></code></li>
</ol>

例如,为了获得一个 ndarray 中的所有偶数值,你可以使用如下的布尔索引操作:

<ol>
<li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> my_ndarray</span><span>[</span><span>my_ndarray </span><span>%</span><span> </span><span>2</span><span> </span><span>==</span><span> </span><span>0</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li>
<li><code><span>[</span><span> </span><span>2</span><span></span><span>4</span><span></span><span>6</span><span></span><span>8</span><span> </span><span>10</span><span>]</span></code></li>
</ol>

而要得到所有的奇数值,你可以用这个方法:

<ol>
<li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> my_ndarray</span><span>[</span><span>my_ndarray </span><span>%</span><span> </span><span>2</span><span> </span><span>==</span><span> </span><span>1</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2</span><span>)</span></code></li>
<li><code><span>[</span><span>1</span><span> </span><span>3</span><span> </span><span>5</span><span> </span><span>7</span><span> </span><span>9</span><span>]</span></code></li>
</ol>

ndarray 的矢量和标量算术

NumPy 的 ndarray 允许进行矢量和标量算术操作。在矢量算术中,在两个 ndarray 之间进行一个元素的算术操作。在标量算术中,算术运算是在一个 ndarray 和一个常数标量值之间进行的。

如下的两个 ndarray:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>3</span><span>,</span><span> </span><span>4</span><span>,</span><span> </span><span>5</span><span>])</span></code></li>
<li><code><span>>>></span><span> my_ndarray2 </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>6</span><span>,</span><span> </span><span>7</span><span>,</span><span> </span><span>8</span><span>,</span><span> </span><span>9</span><span>,</span><span> </span><span>10</span><span>])</span></code></li>
</ol>

如果你将上述两个 ndarray 相加,就会产生一个两个 ndarray 的元素相加的新的 ndarray。例如,产生的 ndarray 的第一个元素将是原始 ndarray 的第一个元素相加的结果,以此类推:

<ol>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2 </span><span>+</span><span> my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span> </span><span>7</span><span></span><span>9</span><span> </span><span>11</span><span> </span><span>13</span><span> </span><span>15</span><span>]</span></code></li>
</ol>

这里,7 是 1 和 6 的和,这是我相加的 ndarray 中的前两个元素。同样,15 是 5 和10 之和,是最后一个元素。

请看以下算术运算:

<ol>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2 </span><span>-</span><span> my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span>5</span><span> </span><span>5</span><span> </span><span>5</span><span> </span><span>5</span><span> </span><span>5</span><span>]</span></code></li>
<li><code><span>>>></span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2 </span><span>*</span><span> my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span> </span><span>6</span><span> </span><span>14</span><span> </span><span>24</span><span> </span><span>36</span><span> </span><span>50</span><span>]</span></code></li>
<li><code><span>>>></span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray2 </span><span>/</span><span> my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span>6.</span><span> </span><span>3.5</span><span></span><span>2.66666667</span><span> </span><span>2.25</span><span> </span><span>2.</span><span></span><span>]</span></code></li>
</ol>

在 ndarray 中加一个标量值也有类似的效果,标量值被添加到 ndarray 的所有元素中。这被称为“广播broadcasting”:

<ol>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray </span><span>+</span><span> </span><span>10</span><span>)</span></code></li>
<li><code><span>[</span><span>11</span><span> </span><span>12</span><span> </span><span>13</span><span> </span><span>14</span><span> </span><span>15</span><span>]</span></code></li>
<li><code><span>>>></span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray </span><span>-</span><span> </span><span>10</span><span>)</span></code></li>
<li><code><span>[-</span><span>9</span><span> </span><span>-</span><span>8</span><span> </span><span>-</span><span>7</span><span> </span><span>-</span><span>6</span><span> </span><span>-</span><span>5</span><span>]</span></code></li>
<li><code><span>>>></span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray </span><span>*</span><span> </span><span>10</span><span>)</span></code></li>
<li><code><span>[</span><span>10</span><span> </span><span>20</span><span> </span><span>30</span><span> </span><span>40</span><span> </span><span>50</span><span>]</span></code></li>
<li><code><span>>>></span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray </span><span>/</span><span> </span><span>10</span><span>)</span></code></li>
<li><code><span>[</span><span>0.1</span><span> </span><span>0.2</span><span> </span><span>0.3</span><span> </span><span>0.4</span><span> </span><span>0.5</span><span>]</span></code></li>
</ol>

ndarray 的排序

有两种方法可以对 ndarray 进行原地或非原地排序。原地排序会对原始 ndarray 进行排序和修改,而非原地排序会返回排序后的 ndarray,但不会修改原始 ndarray。我将尝试这两个例子:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>3</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>4</span><span>])</span></code></li>
<li><code><span>>>></span><span> my_ndarray</span><span>.</span><span>sort</span><span>()</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span>1</span><span> </span><span>2</span><span> </span><span>3</span><span> </span><span>4</span><span> </span><span>5</span><span>]</span></code></li>
</ol>

正如你所看到的,sort() 方法对 ndarray 进行原地排序,并修改了原数组。

还有一个方法叫 np.sort(),它对数组进行非原地排序:

<ol>
<li><code><span>>>></span><span> my_ndarray </span><span>=</span><span> np</span><span>.</span><span>array</span><span>([</span><span>3</span><span>,</span><span> </span><span>1</span><span>,</span><span> </span><span>2</span><span>,</span><span> </span><span>5</span><span>,</span><span> </span><span>4</span><span>])</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>np</span><span>.</span><span>sort</span><span>(</span><span>my_ndarray</span><span>))</span></code></li>
<li><code><span>[</span><span>1</span><span> </span><span>2</span><span> </span><span>3</span><span> </span><span>4</span><span> </span><span>5</span><span>]</span></code></li>
<li><code><span>>>></span><span> </span><span>print</span><span>(</span><span>my_ndarray</span><span>)</span></code></li>
<li><code><span>[</span><span>3</span><span> </span><span>1</span><span> </span><span>2</span><span> </span><span>5</span><span> </span><span>4</span><span>]</span></code></li>
</ol>

正如你所看到的,np.sort() 方法返回一个已排序的 ndarray,但没有修改它。

总结

我已经介绍了很多关于 NumPy 和 ndarray 的内容。我谈到了创建 ndarray,读取它们的不同方法,基本的向量和标量算术,以及排序。NumPy 还有很多东西可以探索,包括像 union() 和 intersection()这样的集合操作,像 min() 和 max() 这样的统计操作,等等。

我希望我上面演示的例子是有用的。祝你在探索 NumPy 时愉快。 

 

以上是用 NumPy 在 Python 中處理數字的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:51cto.com。如有侵權,請聯絡admin@php.cn刪除