【问题标题】:how to iterate through 2d array and add elements如何遍历二维数组并添加元素
【发布时间】:2021-02-16 00:32:08
【问题描述】:

我有以下二维数组:

['AA' 'Call' 1]
['AAL' 'Call' 1]
['AAL' 'Put' 1]
['AAP' 'call' 1]
['AAPL' 'Call' 13]
['AAPL' 'Put' 11]
['AAWW' 'Call' 1]
['ABBV' 'put' 1]
['ABNB' 'Call' 2]
['ABNB' 'Put' 2]
['ABT' 'Call' 2]
['ACB' 'Call' 5]
['ACB' 'Put' 15]

这是我想要的样子

['AA' 'Call' 1]
['AA' 'put' 0]
['AAL' 'Call' 1]
['AAL' 'Put' 1]
['AAP' 'call' 1]
['AAP' 'put' 0]
['AAPL' 'Call' 13]
['AAPL' 'Put' 11]
['AAWW' 'Call' 1]
['AAWW' 'Put' 0]
['ABBV' 'Call' 0]
['ABBV' 'put' 1]
['ABNB' 'Call' 2]
['ABNB' 'Put' 2]
['ABT' 'Call' 2]
['ABT' 'put' 0]
['ACB' 'Call' 5]
['ACB' 'Put' 15]

如果缺少看涨期权或看跌期权,我想将缺失的值添加为零。 这是我的尝试:

i =  0
while i < len(arr):
    if(i+1<len(arr) and i>0):
        if((arr[i][0]!=arr[i+1][0]) and (arr[i-1][0]!=arr[i][0])):
            if(arr[i][1]=='Call'):
                ticker = arr[i][0]
                val = [ticker,'Put','0']
                arr = np.insert(arr, i+1,val)
                i += 1
            elif(arr[i][1]=='Put'):
                ticker = arr[i][0]
                val = [ticker,'Call','0']
                arr = np.insert(arr, i-1,val)
                i +=1
    i += 1

订单必须先看涨再看跌。我在这里错过了什么?

【问题讨论】:

  • 代码有什么问题?它与您想要的有什么不同?
  • @mkrieger1 出现错误提示字符串索引超出范围
  • 你明白这意味着什么吗?
  • 这意味着我正在尝试访问一个不存在的索引,但是我在第三行设置 I > 0 的原因是为了确保不会发生这种情况。
  • 您的数据包含Put 和小写put 的实例?同样,Callcall 还是您添加该示例时的问题?

标签: python arrays


【解决方案1】:

这里有一个解决方案:

arr=[
['AA','Call', 1],
['AAL', 'Call', 1],
['AAL', 'Put', 1],
['AAP', 'Call', 1],
['AAPL', 'Call', 13],
['AAPL', 'Put', 11],
['AAWW', 'Call', 1],
['ABBV', 'Put', 1],
['ABNB', 'Call', 2],
['ABNB', 'Put', 2],
['ABT', 'Call', 2],
['ACB', 'Call', 5],
['ACB', 'Put', 15]]

i=0
while i < len(arr):
    if i+1<len(arr):
        if arr[i][0]!=arr[i+1][0]:
            if arr[i][1]=='Call':
                arr.insert(i+1,[arr[i][0],'Put',0])
            else:
                arr.insert(i,[arr[i][0],'Call',0])            
        i += 1            
    else:
        if arr[i][1]=='Call':
            arr.append([arr[i][0],'Put',0])
        else:
            arr.insert(i,[arr[i][0],'Call',0])
        i += 1
        
    i += 1

请注意,您需要满足列表中的最后一项(即当i+1 超出范围时)。

【讨论】:

  • 我收到此错误AttributeError: 'numpy.ndarray' object has no attribute 'insert'
【解决方案2】:

您的主要问题是np.insert。默认情况下,它首先展平数组,然后插入新数据,因此在第一次插入后,我们的数组变为一维,第二个索引开始应用于第一个索引返回的字符串元素。这就是错误的原因。如果您使用arr[i, 0] 而不是arr[i][0],您应该更早理解它。 为避免展平,您需要指定沿其插入新值的轴。在你的情况下它是轴 0,所以你需要有

arr = np.insert(arr, i+1,val, axis=0)
...
arr = np.insert(arr, i-1,val, axis=0)

即使之后结果与您发布的示例不同,原因在于您使用的条件。我不知道哪个是错误的:示例或条件,但相信您将能够自己修复它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2011-07-18
    • 2015-04-07
    • 2016-09-04
    相关资源
    最近更新 更多