[英]Python : how to make 1-D array from 2-D array
我有array2D = [[1,2,3],[4,5,6]]
。 我想要的是一個函數,該函數需要一個索引並返回一維數組中的元素。
Example: fn(0) -> returns [1,4]
fn{1) -> returns [2,5]
我需要一種快速的方法來做到這一點。
您可以使用lambda
和list comprehension
:
array2D = [[1,2,3],[4,5,6]]
fn = lambda x: [item[x] for item in array2D]
print(fn(0)) # [1, 4]
print(fn(1)) # [2, 5]
print(fn(2)) # [3, 6]
如注釋中所建議,您可以對函數定義應用相同的概念:
def fn(x): return [item[x] for item in array2D]
print(fn(0)) # [1, 4]
print(fn(1)) # [2, 5]
print(fn(2)) # [3, 6]
Lambda函數非常有用 ,可以讓您以一種非常清晰的方式定義操作。
在我們的示例中,我們的lambda接受變量x
,該變量表示我們想要的array2D
中每個item
的array2D
然后您有了list comprehension ,類似於lambda函數,它們是一個非常強大的工具,並且是python中的必備工具
在這種情況下,您應該先執行PEP-8建議的函數定義。
以下列表理解將起作用:
def fn(i, lst):
return [sublst[i] for sublst in lst]
>>> array2D = [[1, 2, 3], [4, 5, 6]]
>>> fn(0, array2D)
[1, 4]
>>> fn(1, array2D)
[2, 5]
您可以使用operator.itemgetter
:
array2D = [[1,2,3],[4,5,6]]
from operator import itemgetter
def fn(x, k):
return list(map(itemgetter(k), x))
fn(array2D, 0) # [1, 4]
如果要定義用於檢索特定索引的新函數,可以通過functools.partial
:
from functools import partial
def fn(x, k):
return list(map(itemgetter(k), x))
get_zero_index = partial(fn, k=0)
get_zero_index(array2D) # [1, 4]
發電機怎么樣?
我們可以使用zip
打包它們,然后創建一個空列表來存儲生成的數據:
class myZip(object):
__slots__ = ('zipData', 'interList')
def __init__(self, *args):
self.zipData = zip(*args)
self.interList = []
def __call__(self, index):
try:
return self.interList[index]
except IndexError:
try:
if index == 0:
self.interList.append(next(self.zipData))
return self.interList[index]
for i in range(index-(len(self.interList)-1)):
self.interList.append(next(self.zipData))
return self.interList[index]
except StopIteration:
raise IndexError("index out of range")
def __iter__(self):
for i in self.interList:
yield i
for i in self.zipData:
yield i
array2D = [[1,2,3],[4,5,6]]
a = myZip(*array2D)
print(a(2))
print(a(1))
print(a(0))
---
(3, 6)
(2, 5)
(1, 4)
這樣做的好處是我們不需要一次生成所有數據。
這是我使用切片的2美分(我必須為此使用其他np.array()
,因為您的原始數據是list
):
array2D = np.array([[1,2,3],[4,5,6]])
def fn(n): return (list(array2D[:,n]))
print (fn(0), fn(1), fn(2))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.