我正在尝试填充大小为[x][3]
的2D数组。 X
只是工作表的大小(行数),我感兴趣的是3列。列彼此不相邻,例如{AA}应该从AA列填充, arr[i][0]
应来自K列,arr[i][1]
需要来自L列。
我尝试按以下方式分配它,但在数组值赋值中出错。
对此的任何帮助将不胜感激!
代码:
arr[i][2]
如果没有循环遍历整个列,有没有办法做到这一点?
答案 0 :(得分:3)
如评论中所述,您可以填充三个2-D阵列。然后,您可以从三个数组中填充第四个数组,如下所示。
import numpy as np
import pandas as pd
class NAN(object):
def __eq__(self, v):
return np.isnan(v)
def __hash__(self):
return hash(np.nan)
nan = NAN()
df = pd.DataFrame([1,2,3,float('nan')], columns=['A'])
df.A.isin([1, nan])
以上将要求所有3列的长度相同(否则填充最后一个数组将不起作用);这是因为第四个数组被重新定义为包含第一个数组中包含的元素数。
使用250,000行数据进行测试,第四个数组在0.43秒内填充。
答案 1 :(得分:1)
你得到的数组对你的回报有多宽松?我可以为你提供一个Array(col)(row)
样式的数组,如果可行的话,无需循环获取它。请注意,顺便说一下,Array(col, row)
不是Dim a(1 To 3)
a(1) = WorksheetFunction.Index(WorksheetFunction.Transpose(Range("AA2:AA10")), 1, 0)
a(2) = WorksheetFunction.Index(WorksheetFunction.Transpose(Range("K2:K10" )), 1, 0)
a(3) = WorksheetFunction.Index(WorksheetFunction.Transpose(Range("L2:L10" )), 1, 0)
。它是一个列的一维数组,每个元素包含一个行值的一维数组。如果你对此感到满意,你可以这样做:
Debug.Print UBound(a) ' Number of columns (3)
Debug.Print UBound(a(1)) ' Number of rows in column 1
Debug.Print a(1)(3) ' Value of column 1 (AA), row 3
然后你就可以访问你的数组项了:
Index()
Transpose()
函数可以返回一维数组,但只能返回行方向。因此,您需要将其与CURSOR c_2800s(map_code VARCHAR2,serv_code VARCHAR2,sub_serv_code VARCHAR2,bill_to_datetime VARCHAR2) IS
SELECT DISTINCT kndtctc.tctc_cncclipu,TCTC_CNCTAEJE,TCTC_CNNETNAM,nvl(TEXE_CNASUPRO,0000000000),nvl(TEXE_CNNETNAM,00)
FROM KNDTSCM, KNDTCTC, KNDTEXE
WHERE trim(TSCM_CNMAPCO) = map_code
AND KNDTSCM.TSCM_CNCONTRA = kndtctc.tctc_cncclipu
AND KNDTCTC.TCTC_CNTIPCLI = 'C' -- FOR H2H --
AND KNDTCTC.TCTC_CNESTADO IN ('01','03')
AND kndtctc.tctc_cncclipu = kndtexe.texe_cncclipu
AND kndtexe.texe_cnestado in ('01','03')
AND KNDTSCM.TSCM_CNESTADO IN ('01','03')
AND trim(kndtscm.tscm_cnservic) = trim(kndtexe.texe_cnfuncid)
AND trim(kndtscm.tscm_cnsubser) = trim(kndtexe.texe_cnsubser)
AND trim(KNDTEXE.TEXE_CNFUNCID) = serv_code
AND trim(kndtexe.texe_cnsubser) = sub_serv_code;
组合以返回1D列数组。这就是上面的所有代码。
答案 2 :(得分:1)
数组数组怎么样?
Sub NoLoop()
Dim R1 As Range, R2 As Range, R3 As Range
Dim Arr1() As Variant, Arr2() As Variant, Arr3() As Variant
Dim LR As Long
LR1 = Cells(Rows.Count, "AA").End(xlUp).Row
LR2 = Cells(Rows.Count, "K").End(xlUp).Row
LR3 = Cells(Rows.Count, "L").End(xlUp).Row
Set R1 = Range(Cells(1, "AA"), Cells(LR1, "AA"))
Set R2 = Range(Cells(1, "K"), Cells(LR2, "K"))
Set R3 = Range(Cells(1, "L"), Cells(LR3, "L"))
Arr1 = R1.Value
Arr2 = R2.Value
Arr3 = R3.Value
ArrArr = Array(Arr1, Arr2, Arr3)
End Sub
使用此功能,您可以使用以下方式调用您的值:
MyVal = ArrArr(0)(1,1)
MyVal = ArrArr(0)(2,1)
MyVal = ArrArr(1)(1,1)
第一个数字用于数组(从0开始,以2结尾),第二个数字用于填充数组的范围的行/单元格。 第三个数字始终为1(因为向数组添加范围会返回一个二维数组)
使用此代码,您还可以为每列提供不同的尺寸,以节省内存。