繁体   English   中英

Python:如何从2D数组制作1D数组

[英]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]

我需要一种快速的方法来做到这一点。

您可以使用lambdalist 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中每个itemarray2D

然后您有了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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM