首页 文章

如何在Python中声明一个数组?

提问于
浏览
374

如何在Python中声明数组?

我在文档中找不到任何对数组的引用 .

16 回答

  • 9
    variable = []
    

    现在 variable 指的是一个空列表* .

    当然这是一项任务,而非宣言 . 在Python中没有办法说“这个变量永远不应该引用除列表以外的任何东西”,因为Python是动态类型的 .


    *默认的内置Python类型称为列表,而不是数组 . 它是一个任意长度的有序容器,可以容纳异质的对象集合(它们的类型无关紧要,可以自由混合) . 这不应该与array module混淆,后者提供了更接近C array 类型的类型;内容必须是同质的(所有相同的类型),但长度仍然是动态的 .

  • 6

    你实际上没有声明事情,但这是你在Python中创建数组的方式:

    from array import array
    intarray = array('i')
    

    有关更多信息,请参阅阵列模块:http://docs.python.org/library/array.html

    现在可能你不想要一个数组,而是一个列表,但其他人已经回答了这个问题 . :)

  • 11

    这是Python中令人惊讶的复杂主题 .

    实用答案

    数组由类 list 表示(请参阅reference,不要将它们与generators混合) .

    查看用法示例:

    # empty array
    arr = [] 
    
    # init with values (can contain mixed types)
    arr = [1, "eels"]
    
    # get item by index (can be negative to access end of array)
    arr = [1, 2, 3, 4, 5, 6]
    arr[0]  # 1
    arr[-1] # 6
    
    # get length
    length = len(arr)
    
    # supports append and insert
    arr.append(8)
    arr.insert(6, 7)
    

    理论答案

    在引擎盖下,Python的 list 是一个真实数组的包装器,它包含对项的引用 . 此外,底层数组创建了一些额外的空间 .

    其后果是:

    • 随机访问真的很便宜( arr[6653]arr[0] 相同)

    • append 操作是'for free',而一些额外的空间

    • insert 操作很昂贵

    检查这个awesome table of operations complexity .

    另外,请看这张图片,我试图显示数组,引用数组和链表之间最重要的区别:
    arrays, arrays everywhere

  • 292

    我认为你(意味着)想要一个已填充前30个单元格的列表 . 所以

    f = []
    
       for i in range(30):
           f.append(0)
    

    可以使用它的一个例子是Fibonacci序列 . 见Project Euler中的问题2

  • 35

    这是如何:

    my_array = [1, 'rebecca', 'allard', 15]
    
  • 6

    你没有用Python声明任何东西 . 你只需要使用它 . 我建议你从http://diveintopython.net开始 .

  • 5

    要进行计算,请使用numpy数组,如下所示:

    import numpy as np
    
    a = np.ones((3,2))        # a 2D array with 3 rows, 2 columns, filled with ones
    b = np.array([1,2,3])     # a 1D array initialised using a list [1,2,3]
    c = np.linspace(2,3,100)  # an array with 100 points beteen (and including) 2 and 3
    
    print(a*1.5)  # all elements of a times 1.5
    print(a.T+b)  # b added to the transpose of a
    

    这些numpy数组可以从磁盘中保存和加载(甚至是压缩的),并且具有大量元素的复杂计算速度很快 . 很多用于科学环境 . 有关更多信息,请参阅here

  • 2

    我通常会做 a = [1,2,3] 这实际上是 list 但是对于 arrays 看看这个正式definition

  • 62

    一些贡献表明python中的数组由列表表示 . 也许理论上/幕后是正确的,但两者之间的主要区别在于列表接受混合数据类型和混合数字类型,另一方面,数组需要将所有元素限制为确定类型的类型代码:

    list_01 = [4, 6.2, 7-2j, 'flo', 'cro']
    
    list_01
    Out[85]: [4, 6.2, (7-2j), 'flo', 'cro']
    

    使用array()是不可能的 .

  • 74

    要添加到Lennart的答案,可以像这样创建一个数组:

    from array import array
    float_array = array("f",values)
    

    其中值可以采用元组,列表或np.array的形式,但不是数组:

    values = [1,2,3]
    values = (1,2,3)
    values = np.array([1,2,3],'f')
    # 'i' will work here too, but if array is 'i' then values have to be int
    wrong_values = array('f',[1,2,3])
    # TypeError: 'array.array' object is not callable
    

    输出仍然是相同的:

    print(float_array)
    print(float_array[1])
    print(isinstance(float_array[1],float))
    
    # array('f', [1.0, 2.0, 3.0])
    # 2.0
    # True
    

    列表的大多数方法也使用数组,常见的是pop(),extend()和append() .

    从答案和评论来看,似乎阵列数据结构并不那么受欢迎 . 我喜欢它,就像人们可能更喜欢列表中的元组一样 .

    数组结构比list或np.array具有更严格的规则,这可以减少错误并使调试更容易,尤其是在处理数值数据时 .

    尝试将float插入/附加到int数组将引发TypeError:

    values = [1,2,3]
    int_array = array("i",values)
    int_array.append(float(1))
    # or int_array.extend([float(1)])
    
    # TypeError: integer argument expected, got float
    

    因此,保持数组形式的整数值(例如索引列表)可能会阻止“TypeError:list indices必须是整数,而不是float”,因为数组可以迭代,类似于np.array和lists:

    int_array = array('i',[1,2,3])
    data = [11,22,33,44,55]
    sample = []
    for i in int_array:
        sample.append(data[i])
    

    令人讨厌的是,将一个int附加到float数组将导致int变为float,而不会引发异常 .

    np.array也为其条目保留相同的数据类型,但它不会发出错误,而是更改其数据类型以适应新条目(通常为double或str):

    import numpy as np
    numpy_int_array = np.array([1,2,3],'i')
    for i in numpy_int_array:
        print(type(i))
        # <class 'numpy.int32'>
    numpy_int_array_2 = np.append(numpy_int_array,int(1))
    # still <class 'numpy.int32'>
    numpy_float_array = np.append(numpy_int_array,float(1))
    # <class 'numpy.float64'> for all values
    numpy_str_array = np.append(numpy_int_array,"1")
    # <class 'numpy.str_'> for all values
    data = [11,22,33,44,55]
    sample = []
    for i in numpy_int_array_2:
        sample.append(data[i])
        # no problem here, but TypeError for the other two
    

    在任务期间也是如此 . 如果指定了数据类型,则np.array将尽可能将条目转换为该数据类型:

    int_numpy_array = np.array([1,2,float(3)],'i')
    # 3 becomes an int
    int_numpy_array_2 = np.array([1,2,3.9],'i')
    # 3.9 gets truncated to 3 (same as int(3.9))
    invalid_array = np.array([1,2,"string"],'i')
    # ValueError: invalid literal for int() with base 10: 'string'
    # Same error as int('string')
    str_numpy_array = np.array([1,2,3],'str')
    print(str_numpy_array)
    print([type(i) for i in str_numpy_array])
    # ['1' '2' '3']
    # <class 'numpy.str_'>
    

    或者,在本质:

    data = [1.2,3.4,5.6]
    list_1 = np.array(data,'i').tolist()
    list_2 = [int(i) for i in data]
    print(list_1 == list_2)
    # True
    

    而数组将简单地给出:

    invalid_array = array([1,2,3.9],'i')
    # TypeError: integer argument expected, got float
    

    因此,将np.array用于特定于类型的命令并不是一个好主意 . 数组结构在这里很有用 . list保留值的数据类型 .

    对于我发现相当讨厌的东西:数据类型被指定为array()中的第一个参数,但(通常)是np.array()中的第二个参数 . :|

    与C的关系在这里提到:Python List vs. Array - when to use?

    玩得开心!

    注意:数组的类型和相当严格的性质更倾向于C而不是Python,并且根据设计,Python在其函数中没有许多特定于类型的约束 . 它的不受欢迎也会在协同工作中产生积极的反馈,而替换它主要涉及额外的[int(x)for x in file] . 因此,忽略阵列的存在是完全可行和合理的 . 它不应该以任何方式阻碍我们大多数人 . :d

  • 103

    继Lennart之后,还有numpy实现了同构多维数组 .

  • 4

    这个怎么样...

    >>> a = range(12)
    >>> a
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]
    >>> a[7]
    6
    
  • 11

    Python称它们为lists . 您可以使用方括号和逗号编写列表文字:

    >>> [6,28,496,8128]
    [6, 28, 496, 8128]
    
  • 3

    JohnMachin's comment应该是真正的答案 . 在我看来,所有其他答案都只是解决方法!所以:

    array=[0]*element_count
    
  • 13

    您可以创建列表并将它们转换为数组,也可以使用numpy模块创建数组 . 以下几个例子来说明相同的内容 . Numpy还可以更轻松地使用多维数组 .

    import numpy as np
    a = np.array([1, 2, 3, 4])
    
    #For custom inputs
    a = np.array([int(x) for x in input().split()])
    

    您还可以使用重塑函数将此数组重新整形为2X2矩阵,该函数将输入作为矩阵的维度 .

    mat = a.reshape(2, 2)
    
  • 15

    我有一个字符串数组,需要一个与True相同长度的布尔值的数组 . 这就是我做的

    strs = ["Hi","Bye"] 
    bools = [ True for s in strs ]
    

相关问题