18
import os
import numpy as np
from scipy.signal import *
import csv
import matplotlib.pyplot as plt

from scipy import signal
from brainflow.board_shim import BoardShim, BrainFlowInputParams, LogLevels, BoardIds
from brainflow.data_filter import DataFilter, FilterTypes, AggOperations, WindowFunctions, DetrendOperations
from sklearn.cluster import KMeans

#Options to read: 'EEG-IO', 'EEG-VV', 'EEG-VR', 'EEG-MB'
data_folder = 'EEG-IO' 

# Parameters and bandpass filtering
fs = 250.0

# Reading data files
file_idx = 0
list_of_files = [f for f in os.listdir(data_folder) if os.path.isfile(os.path.join(data_folder, f)) and '_data' in f] #List of all the files, Lists are randomized, its only looking for file with _data in it
print(list_of_files)
file_sig = list_of_files[file_idx] # Data File
file_stim = list_of_files[file_idx].replace('_data','_labels') #Label File, Replacing _data with _labels
print ("Reading: ", file_sig, file_stim)

# Loading data
if data_folder == 'EEG-IO' or data_folder == 'EEG-MB':
    data_sig = np.loadtxt(open(os.path.join(data_folder,file_sig), "rb"), delimiter=";", skiprows=1, usecols=(0,1,2)) #data_sig would be a buffer
elif data_folder == 'EEG-VR' or data_folder == 'EEG-VV':
    data_sig = np.loadtxt(open(os.path.join(data_folder,file_sig), "rb"), delimiter=",", skiprows=5, usecols=(0,1,2)) 
    data_sig = data_sig[0:(int(200*fs)+1),:] # getting data ready -- not needed for previous 2 datasets
    data_sig = data_sig[:,0:3] #
    data_sig[:,0] = np.array(range(0,len(data_sig)))/fs


############ Calculating PSD ############
index, ch = data_sig.shape[0], data_sig.shape[1]
# print(index)
feature_vectors = [[], []]
feature_vectorsa = [[], []]
feature_vectorsb = [[], []]
feature_vectorsc = [[], []]
#for x in range(ch):
#for x in range(1,3):
#while x < 
#while x>0:
x=1
while x>0 and x<3:
    if x==1:
        data_sig[:,1] = lowpass(data_sig[:,1], 10, fs, 4)

    elif x==2:
        data_sig[:,2] = lowpass(data_sig[:,2], 10, fs, 4)

    for y in range(500, 19328 ,500):
        #print(ch)
        if x==1:
            DataFilter.detrend(data_sig[y-500:y, 1], DetrendOperations.LINEAR.value)

            psd = DataFilter.get_psd_welch(data_sig[y-500:y, 1], nfft, nfft//2, 250,
                                       WindowFunctions.BLACKMAN_HARRIS.value)

            band_power_delta = DataFilter.get_band_power(psd, 1.0, 4.0)
            
            # Theta 4-8
            band_power_theta = DataFilter.get_band_power(psd, 4.0, 8.0)
            
            #Alpha 8-12
            band_power_alpha = DataFilter.get_band_power(psd, 8.0, 12.0)
             
            #Beta 12-30
            band_power_beta = DataFilter.get_band_power(psd, 12.0, 30.0)
            # print(feature_vectors.shape)

            feature_vectors[x].insert(y, [band_power_delta, band_power_theta, band_power_alpha, band_power_beta])
            feature_vectorsa[x].insert(y, [band_power_delta, band_power_theta])

        elif x==2:
            DataFilter.detrend(data_sig[y-500:y, 2], DetrendOperations.LINEAR.value)

            psd = DataFilter.get_psd_welch(data_sig[y-500:y, 2], nfft, nfft//2, 250,
                                       WindowFunctions.BLACKMAN_HARRIS.value)

            band_power_delta = DataFilter.get_band_power(psd, 1.0, 4.0)
            
            # Theta 4-8
            band_power_theta = DataFilter.get_band_power(psd, 4.0, 8.0)
            
            #Alpha 8-12
            band_power_alpha = DataFilter.get_band_power(psd, 8.0, 12.0)
             
            #Beta 12-30
            band_power_beta = DataFilter.get_band_power(psd, 12.0, 30.0)
            # print(feature_vectors.shape)

            # feature_vectorsc[x].insert(y, [band_power_delta, band_power_theta, band_power_alpha, band_power_beta])
            # feature_vectorsd[x].insert(y, [band_power_delta, band_power_theta])

    x = x+1

print(feature_vectorsa)
powers = np.log10(np.asarray(feature_vectors, dtype=float))
powers1 = np.log10(np.asarray(feature_vectorsa, dtype=float))
# powers2 = np.log10(np.asarray(feature_vectorsb))
# powers3 = np.log10(np.asarray(feature_vectorsc))
print(powers.shape)
print(powers1.shape)

Super confused. When I run my code, I keep on getting this error:

ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part.

Traceback:

File "/Users/mikaelhaji/Downloads/EEG-EyeBlinks/read_data.py", line 170, in powers = np.log10(np.asarray(feature_vectors, dtype=float)) File "/Library/Frameworks/Python.framework/Versions/3.8/lib/python3.8/site-packages/numpy/core/_asarray.py", line 102, in asarray return array(a, dtype, copy=False, order=order) ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part.

If you have any thoughts/ answers as to why this may be occurring, please let me know.

Thanks in advance for the responses.

ILovePhysics
  • 313
  • 1
  • 2
  • 7
  • First, please post a full traceback with line numbers. Otherwise, we can only guess which line of your code raised a `ValueError`. Second, don't just paste your whole code here. Try to create a [minimal, reproducible example](https://stackoverflow.com/help/minimal-reproducible-example). – jjramsey Apr 20 '21 at 17:24
  • 1
    I apologize. Will do that right now. – ILovePhysics Apr 20 '21 at 17:30
  • @jjramsey I just made code a little more concise and added traceback – ILovePhysics Apr 20 '21 at 17:35
  • It can't make numeric array from `feature_vectors`, probably because of a mix of list sizes – hpaulj Apr 20 '21 at 17:42
  • 1
    I faced a similar problem, and in my case, the size of the inner arrays was different. Once I corrected this issue by ensuring consistent array sizes, the problem was resolved. This could not be a solution to this issue, but this might help somebody like me, who spent hours resolving the issue :D. – vipin Aug 22 '23 at 20:32

7 Answers7

16

Have you tried downgrading the numpy? When I downgraded it from 1.24.1 to 1.21.6, the error went away, only UserWarning and FutureWarning exist.

!pip install numpy==1.21.6
Lorry
  • 382
  • 2
  • 7
2

Here's a simple case that produces your error message:

In [19]: np.asarray([[1,2,3],[4,5]],float)
Traceback (most recent call last):
  File "<ipython-input-19-72fd80bc7856>", line 1, in <module>
    np.asarray([[1,2,3],[4,5]],float)
  File "/usr/local/lib/python3.8/dist-packages/numpy/core/_asarray.py", line 102, in asarray
    return array(a, dtype, copy=False, order=order)
ValueError: setting an array element with a sequence. The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (2,) + inhomogeneous part.

If I omit the float, it makes an object dtype array - with warning.

In [20]: np.asarray([[1,2,3],[4,5]])
/usr/local/lib/python3.8/dist-packages/numpy/core/_asarray.py:102: VisibleDeprecationWarning: Creating an ndarray from ragged nested sequences (which is a list-or-tuple of lists-or-tuples-or ndarrays with different lengths or shapes) is deprecated. If you meant to do this, you must specify 'dtype=object' when creating the ndarray.
  return array(a, dtype, copy=False, order=order)
Out[20]: array([list([1, 2, 3]), list([4, 5])], dtype=object)
hpaulj
  • 221,503
  • 14
  • 230
  • 353
1

I was getting the same error. I was opening a txt file that contains a table of values, and saving it into a NumPy array defining the dtype as float since otherwise, the numbers would be strings.

with open(dirfile) as fh:
    next(fh)
    header = next(fh)[2:]
    next(fh)
    data = np.array([line.strip().split() for line in fh], float)

For the previous files, it worked perfectly however for the last file it did not: The requested array has an inhomogeneous shape after 1 dimensions. The detected shape was (35351,) + inhomogeneous part.

However when I ran data = nploadtxt(fh) a new error appeared: Wrong number of columns at line 35351

So, my problem was that the last line of the file was missing the values of the two last columns. I corrected it in the txt file since I wanted to have the same structure of a numpy.array(dtype=float) and everything worked fine.

1

I tied all the methods mentioned above and none of them worked for me.

The actual problem was the numpy version.

Trying pip install numpy==1.21.1 worked for me.

1

With dtype="object" it works for me.

variable2 = np.asarray(variable1, dtype="object")
Sebastian
  • 1,321
  • 9
  • 21
Chris
  • 11
  • 1
  • Your answer could be improved with additional supporting information. Please [edit] to add further details, such as citations or documentation, so that others can confirm that your answer is correct. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community May 14 '23 at 15:54
1

This error occurs when we have Numpy version problem.

I am using python3.9 so I installed as following:

pip install numpy==1.21.2

and worked for me.

-1

You might have an issue like this: [1, np.array[0,1,2], 3, np.array[8,9,10]]

A simple thing you can do is:

  1. Put the break point where the error is arising
  2. Run the IDE in debug mode
  3. Print the particular variable or line
  4. Avoid this array within array scenario and it will work!
Michael M.
  • 10,486
  • 9
  • 18
  • 34
  • As it’s currently written, your answer is unclear. Please [edit] to add additional details that will help others understand how this addresses the question asked. You can find more information on how to write good answers [in the help center](/help/how-to-answer). – Community Oct 29 '22 at 20:12