NumPy - 從現有資料建立陣列



在 NumPy 中從現有資料建立陣列

您可以透過使用 Python 中已存在的資料結構初始化 NumPy 陣列,或者將其轉換為與 NumPy 相容的格式來從現有資料建立 NumPy 陣列。以下是實現此目的的一些常見方法:

  • 使用 numpy.asarray() 函式
  • 使用 numpy.frombuffer() 函式
  • 使用 numpy.fromiter() 函式
  • 從 Python 列表
  • 從巢狀列表
  • 從 Python 元組
  • 從現有的 NumPy 陣列
  • 使用範圍物件

NumPy 快速執行復雜陣列運算的能力在資料處理和科學計算等領域非常重要。

使用 numpy.asarray() 函式

numpy.asarray() 函式用於將各種 Python 物件轉換為 NumPy 陣列。這些物件包括 Python 列表、元組、其他陣列,甚至標量值。

此函式確保結果始終為 NumPy 陣列,從而方便資料操作和數值計算。以下是語法:

numpy.asarray(a, dtype=None, order=None)

其中,

  • a - 它是要轉換的資料,可以是列表、元組、陣列或任何可以轉換為陣列的物件。

  • dtype(可選) - 陣列所需的資料型別。如果未指定,NumPy 會根據輸入確定資料型別。

  • order(可選) - 指定是以行優先(C)還是列優先(F)順序儲存陣列。預設為 None,這意味著 NumPy 根據輸入決定。

示例:將 Python 列表轉換為 NumPy 陣列

在以下示例中,我們使用 numpy.asarray() 函式將 Python 列表轉換為 NumPy 陣列:

import numpy as np

# Convert list to array
my_list = [1, 2, 3, 4, 5]
arr_from_list = np.asarray(my_list)

print("Array from list:",arr_from_list)

獲得的輸出如下:

Array from list: [1 2 3 4 5]

示例:保留資料型別

在這裡,我們將包含不同資料型別(int、float、bool、str)元素的 Python 列表轉換為 NumPy 陣列,使用 numpy.asarray() 函式:

import numpy as np

# Convert list with different data types to array
my_mixed_list = [1, 2.5, True, 'hello']
arr_from_mixed = np.asarray(my_mixed_list)

print("Array from mixed list:", arr_from_mixed)

這將產生以下結果:

Array from mixed list: ['1' '2.5' 'True' 'hello']

使用 numpy.frombuffer() 函式

numpy.frombuffer() 函式從緩衝區物件(例如位元組物件或位元組陣列)建立陣列。這在處理原始二進位制資料或記憶體緩衝區時非常有用。

此函式將緩衝區物件解釋為一維陣列資料。它允許您指定結果陣列中元素的資料型別。以下是語法:

numpy.frombuffer(buffer, dtype=float, count=-1, offset=0)

其中,

  • buffer - 包含要解釋為陣列的資料的緩衝區物件。

  • dtype(可選) - 結果陣列中元素所需的資料型別。預設為 float。

  • count(可選) - 從緩衝區讀取的專案數。預設為 -1,表示讀取所有資料。

  • offset(可選) - 開始讀取資料的緩衝區內的起始位置。預設為 0。

示例

在此示例中,我們使用 numpy.frombuffer() 函式將位元組物件 "my_bytes" 解釋為位元組的一維陣列:

import numpy as np

# Create bytes object
my_bytes = b'hello world'

# Create array from bytes object
arr_from_bytes = np.frombuffer(my_bytes, dtype='S1')

print("Array from bytes object:",arr_from_bytes)

生成的 NumPy 陣列包含原始位元組物件 'hello world' 的每個位元組:

Array from bytes object: [b'h' b'e' b'l' b'l' b'o' b' ' b'w' b'o' b'r' b'l' b'd']

使用 numpy.fromiter() 函式

numpy.fromiter() 函式從可迭代物件建立一個新的一個維度陣列。它迭代可迭代物件,將每個元素轉換為陣列元素。以下是語法:

numpy.fromiter(iterable, dtype, count=-1)

其中,

  • iterable - 依次產生元素的可迭代物件。

  • dtype - 結果陣列中元素的資料型別。

  • count(可選) - 從可迭代物件讀取的專案數。預設為 -1,表示讀取所有專案。

示例

在下面的示例中,我們使用 numpy.fromiter() 函式從生成器 "my_generator" 建立一個 NumPy 陣列 "gen_array",該生成器產生從 0 到 4 的數字:

import numpy as np

# Generator function that yields numbers
def my_generator(n):
   for i in range(n):
      yield i

# Create array from generator
gen_array = np.fromiter(my_generator(5), dtype=int)

print("Array from generator:",gen_array)

在生成的陣列中,每個元素對應於生成器函式產生的轉換為整數的值:

Array from generator: [0 1 2 3 4]
Python 中的生成器是逐個生成一系列值的函式。NumPy 提供 np.fromiter() 函式來從生成器建立陣列。

從 Python 列表

建立 NumPy 陣列最常見的方法之一是轉換 Python 列表。此方法提供 numpy.array() 函式或 numpy.asarray() 函式來轉換列表(Python 中常用的資料結構)為 NumPy 陣列。

以下是語法:

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

其中,

  • object - 輸入資料,在本例中為 Python 列表。

  • dtype(可選) - 陣列所需的資料型別。如果未指定,NumPy 會從輸入資料中解釋資料型別。

  • copy(可選) - 如果為 True,則確保建立輸入資料的副本。如果為 False,則在可能的情況下避免不必要的複製。

  • order(可選) - 指定陣列的記憶體佈局順序。'C' 表示行優先(C 樣式),'F' 表示列優先(Fortran 樣式),'K' 表示輸入陣列的佈局(預設值)。

  • subok(可選) - 如果為 True,則子類將被傳遞;否則,返回的陣列將強制為基類陣列。

  • ndmin(可選) - 指定結果陣列應具有的最小維度數。

示例

在下面的示例中,我們使用 numpy.array() 函式將包含整數的 Python 列表 "my_list" 轉換為 NumPy 陣列:

import numpy as np

# Convert list to array
my_list = [1, 2, 3, 4, 5]
arr_from_list = np.array(my_list)

print("Array from list:",arr_from_list)

執行上述程式碼後,我們將獲得以下輸出:

Array from list: [1 2 3 4 5]

從巢狀列表

Python 中的巢狀列表是列表中的列表,可以表示多維資料結構。NumPy 提供 array() 函式將這些巢狀列表轉換為多維陣列。

示例:將巢狀列表轉換為二維 NumPy 陣列

在此示例中,巢狀列表 "nested_list" 表示二維結構(列表的列表)。array() 函式將其轉換為二維 NumPy 陣列 "arr_from_nested_list":

import numpy as np

# Convert nested list to array 
nested_list = [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
arr_from_nested_list = np.array(nested_list)

print("Array from nested list:")
print(arr_from_nested_list)

生成的陣列保留二維結構,幷包含與原始巢狀列表相同的元素,如下面的輸出所示:

Array from nested list:
[[1 2 3]
 [4 5 6]
 [7 8 9]]

示例:轉換具有不同資料型別的巢狀列表

在這裡,巢狀列表包含不同資料型別的元素(整數、浮點數、布林值和字串)。array() 函式將所有元素轉換為字串,從而產生一個具有字串資料型別的同構二維陣列:

import numpy as np

# Convert nested list with different data types to array
nested_mixed_list = [[1, 2.5], [True, 'hello']]
arr_from_nested_mixed_list = np.array(nested_mixed_list)

print("Array from nested mixed list:")
print(arr_from_nested_mixed_list)

產生的結果如下:

Array from nested mixed list:
[['1' '2.5']
 ['True' 'hello']]

從 Python 元組

Python 元組是另一種常用的資料結構,可以轉換為 NumPy 陣列。與列表一樣,元組可以用來儲存多個專案,但它們是不可變的,這意味著建立後其內容不能更改。

它可以使用 numpy.array() 函式表示一維和多維資料。

示例

在以下示例中,我們使用 array() 函式將包含整數的 Python 元組轉換為 NumPy 陣列:

import numpy as np

# Convert tuple to array
my_tuple = (1, 2, 3, 4, 5)
arr_from_tuple = np.array(my_tuple)

print("Array from tuple:",arr_from_tuple)

我們將獲得如下所示的輸出:

Array from tuple: [1 2 3 4 5]

從現有的 NumPy 陣列

NumPy 提供了幾種方法來從現有的 NumPy 陣列建立新陣列。它們是:

  • numpy.copy() 函式
  • numpy.asarray() 函式
  • numpy.view() 函式
  • numpy.reshape() 函式
  • 切片

這對於各種任務很有用,例如複製資料、更改資料型別或建立從原始陣列派生的具有特定屬性的新陣列。

示例:使用 numpy.copy() 函式

numpy.copy() 函式建立一個新陣列,它是原始陣列的副本。這確保對新陣列的任何修改都不會影響原始陣列:

import numpy as np

# Original array
original_array = np.array([1, 2, 3, 4, 5])

# Create a copy of the array
copied_array = np.copy(original_array)

print("Original array:",original_array)
print("Copied array:",copied_array)

獲得的輸出如下:

Original array: [1 2 3 4 5]
Copied array: [1 2 3 4 5]

示例:使用 numpy.asarray() 函式

numpy.asarray() 函式將輸入轉換為陣列,但如果輸入已經是陣列,則除非必要(例如,如果指定了不同的資料型別),否則它不會建立副本:

import numpy as np

# Original array
original_array = np.array([1, 2, 3, 4, 5])

# Create an array from the existing array
new_array = np.asarray(original_array, dtype=float)

print("Original array:",original_array)
print("New array:",new_array)

這將產生以下結果:

Original array: [1 2 3 4 5]
New array: [1. 2. 3. 4. 5.]

示例:使用 numpy.view() 函式

numpy.view() 函式建立一個新的陣列物件,它檢視與原始陣列相同的資料。這對於使用不同的資料型別檢視資料很有用:

import numpy as np

# Original array
original_array = np.array([1, 2, 3, 4, 5], dtype=np.int32)

# Create a view of the array with a different dtype
viewed_array = original_array.view(dtype=np.float32)

print("Original array:",original_array)
print("Viewed array with dtype float32:",viewed_array)

以下是上述程式碼的輸出結果 -

Original array: [1 2 3 4 5]
Viewed array with dtype float32: [1.e-45 3.e-45 4.e-45 6.e-45 7.e-45]

示例:使用 numpy.reshape() 函式

numpy.reshape() 函式可以將現有陣列重新整形為新的形狀,而不會改變其資料 -

import numpy as np

# Original array
original_array = np.array([1, 2, 3, 4, 5, 6])

# Reshape the array to 2x3
reshaped_array = original_array.reshape((2, 3))

print("Original array:",original_array)
print("Reshaped array (2x3):",reshaped_array)

獲得的輸出結果如下所示 -

Original array: [1 2 3 4 5 6]
Reshaped array (2x3): [[1 2 3]
 [4 5 6]]

示例:使用切片

對現有陣列進行切片會建立一個新的陣列,該陣列是原始陣列的子集 -

import numpy as np

# Original array
original_array = np.array([1, 2, 3, 4, 5])

# Slice the array to get a subarray
sliced_array = original_array[1:4]

print("Original array:",original_array)
print("Sliced array (elements 1 to 3):",sliced_array)

獲得的輸出結果如下所示 -

原始陣列:[1 2 3 4 5] 切片陣列(元素 1 到 3):[2 3 4]

使用範圍物件

Python 的range物件生成指定範圍內的數字,並且可以使用 numpy.array() 函式或 numpy.fromiter() 函式將其轉換為 NumPy 陣列。當您需要建立大型序列而無需首先在記憶體中顯式儲存所有數字時,這很有用。

示例

在這個示例中,range() 物件生成從 1 到 9 的數字。numpy.array() 函式將此 range 物件轉換為 NumPy 陣列 -

import numpy as np

# Create a range object
my_range = range(1, 10)
# Convert range object to array
arr_from_range = np.array(my_range)

print("Array from range object:",arr_from_range)

執行上述程式碼後,我們將獲得以下輸出:

Array from range object: [1 2 3 4 5 6 7 8 9]
廣告