Python:如何从二维数组生成一维数组
我有Python:如何从二维数组生成一维数组,python,loops,for-loop,while-loop,Python,Loops,For Loop,While Loop,我有array2D=[[1,2,3],[4,5,6]]。我想要的是一个函数,它获取索引并返回1D数组中的元素 Example: fn(0) -> returns [1,4] fn{1) -> returns [2,5] 我需要一种快速的方法来完成此操作。以下列表理解将起作用: def fn(i, lst): return [sublst[i] for sublst in lst] >>> array2D = [[1, 2, 3], [4
array2D=[[1,2,3],[4,5,6]]
。我想要的是一个函数,它获取索引并返回1D数组中的元素
Example: fn(0) -> returns [1,4]
fn{1) -> returns [2,5]
我需要一种快速的方法来完成此操作。以下列表理解将起作用:
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]
您可以使用
lambda
和列表理解
:
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
然后,与lambda函数类似,它们是非常强大的工具,也是python中的必备工具
在这种情况下,您应该预先听函数定义,正如所建议的。您可以使用
操作符。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)
这样做的好处是我们不需要一次生成所有数据。这是我使用切片的两分钱(我必须使用额外的
np.array()
,因为您的原始数据是一个列表
):
你能解释一下为什么lambda函数比常规函数更清晰吗?在我看来,这是一个不必要的额外函数调用。@jpp我没有说lambda函数比常规函数更清晰。我说过lambda函数非常清晰:通常是因为在一行中定义操作所需的简洁性要求对问题有清晰的理解。当然,我们可以让任何事情复杂化,如果我们想让事情复杂化的话,它看起来像是
lambda
。为什么不def fn(x):返回[array2D中项目的项目[x]
?还是一行。和更少的字符(如果有关系)。@jpp它是如何使问题复杂化的?如果你真的想让一个函数返回这样一个通用任务的函数,请使用functools.partial
,请参阅我的更新。
array2D = np.array([[1,2,3],[4,5,6]])
def fn(n): return (list(array2D[:,n]))
print (fn(0), fn(1), fn(2))