[Numpy-discussion] Problems creating numpy.array with a dtype

Jimmie Houchin jlhouchin at gmail.com
Sat May 15 00:24:03 EDT 2010


Hello, I am really liking Numpy a lot. It is wonderful to be able to do 
the things that it does in a language as friendly as Python, and with 
the performance Numpy delivers over standard Python. Thanks.

I am having a problem with creation of Numpy arrays with my generated 
dtypes. I am creating a dataset of a weeks worth of financial 
instruments data, in order to explore and test relationships with 
various Technical Analysis functions.

My basic data is simply a list (or tuple) of lists (or tuples).
((startdate, bidopen, bidhigh, bidlow, bidclose, askopen, askhigh, 
asklow, askclose), ...)

Nothing unusual. However I am creating arrays which have many, many more 
columns to allow storing the data generated from applying the functions 
to the original data.

I have created two functions. One to dynamically create the dtype based 
on data I want to create for the exploration. And another to create the 
array and populate it with the initial data from a database.

Code slightly modified, not tested.

#examples
taFunctions = (smva, wmva)
inputColumns = (bidclose, ohlcavg)

def createDType():
     """Will create a dtype based on the pattern for naming and the
        parameters of those items being stored in the array.
     """
     dttypes = [('startdate','object'),
         ('bidopen','f8'), ('bidhigh','f8'),
         ('bidlow','f8'), ('bidclose','f8'),
         ('askopen','f8'), ('askhigh','f8'),
         ('asklow','f8'), ('askclose','f8'),
         ('ocavg','f8'), ('hlavg','f8'), ('ohlavg','f8'),
         ('ohlcavg','f8'), ('direction','i1'), ('volatility', 'f8'),
         ('spread', 'f8'), ('pivot', 'S4')]
     for f in taFunctions:
         for i in inputColumns:
             dttypes.append((f+"-"+i,'f8'))
     dtminute = np.dtype(dttypes)
     return dtminute, dttypes

def getArray(instrument, weekString=None):
     ...
     cur.execute(sql)
     weekData = cur.fetchall()
     wdata = []
     lst = []
     dtminute, dttypes = createDType()
     for i in dttypes:
         if i[1] == 'f8': lst.append(0.0)
         elif i[1] == 'i1': lst.append(0)
         else: lst.append('')
     for m in weekData:
         data = list(m)+lst[9:]
         wdata.append(data)
     return np.array(wdata,dtype=dtminute)

The createDType() function works fine. The getArray() function fails with:
ValueError: Setting void-array with object members using buffer.

However changing the getArray() function to this works just fine.

def getArray(instrument, weekString=None):
     ...
     cur.execute(sql)
     weekData = cur.fetchall()
     arrayLength = len(weekData)
     lst = []
     dtminute, dttypes = createDType()
     for i in dttypes:
         if i[1] == 'f8': lst.append(0.0)
         elif i[1] == 'i1': lst.append(0)
         else: lst.append('')
     listLength = len(lst)
     weekArray = np.zeros(arrayLength, dtype=dtminute)
     for i in range(arrayLength):
         for j in range(listLength):
             if j < 9: weekArray[i][j] = weekData[i][j]
             else: weekArray[i][j] = lst[j]
     return weekArray

After I finally worked out getArray number two I am back in business 
writing the rest of my app. But I banged my head on version number one 
for quite some time trying to figure out what I am doing wrong. I still 
don't know.

I find no errors in my data length or types. I would thing that either 
would cause version two to fail also.

In help in understanding is greatly appreciated.

This is using Numpy 1.4.1.

Thanks.

Jimmie




More information about the NumPy-Discussion mailing list