0

I want to define a function that determines whether an input to a function is a numpy array or list or the input is none of the two mentioned data types. Here is the code:

def test_array_is_given(arr = None):
    if arr != None:
        if type(arr) in [np.ndarray, list]:
            return True
    return False


input_junk = 12
input_list = [1,2,3,4]
input_numpy = np.array([[1,2,3],[4,5,6]])

print(test_array_is_given(input_junk))
print(test_array_is_given(input_list))
print(test_array_is_given(input_numpy))

And here is what I get:

False
True

---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
/var/folders/gv/k2qrhzhn1tg5g_kcrnxpm3c80000gn/T/ipykernel_1992/766992758.py in <module>
     12 print(test_array_is_given(input_junk))
     13 print(test_array_is_given(input_list))
---> 14 print(test_array_is_given(input_numpy))

/var/folders/gv/k2qrhzhn1tg5g_kcrnxpm3c80000gn/T/ipykernel_1992/766992758.py in test_array_is_given(arr)
      1 def test_array_is_given(arr = None):
----> 2     if arr != None:
      3         if type(arr) in [np.ndarray, list]:
      4             return True
      5     return False

ValueError: The truth value of an array with more than one element is ambiguous. Use a.any() or a.all()

As you can see, I set the default value for argument arr to be None. However, whenever I try to evaluate the function given a numpy array, it faces the above error.

Any ideas on how to resolve this? Thank you for your attention in advance.

1
  • 2
    Comparison with None should be done with is. In this case: if arr is not None: Commented Dec 14, 2021 at 9:34

3 Answers 3

1

Your function might be fixes and ameloriated using isinstance built-in function as follows:

import numpy as np
def test_array_is_given(arr=None):
    return isinstance(arr, (np.ndarray, list))
print(test_array_is_given())  # False
print(test_array_is_given(np.ones(1)))  # True
print(test_array_is_given([1,2,3]))  # True

when 2nd argument is tuple that might be read as any of, in this case check if it is np.ndarray of list. No special check for None is required as it is object of class NoneType.

Sign up to request clarification or add additional context in comments.

1 Comment

Thank you for your reply. I am wondering what to prefer, your solution or what @Matthias suggested (in comment section of the question)?
1

Matthias points this out already: The issue is with the equality check arr != None.

When arr is a numpy array, arr != None checks if each element of arr is unequal to None and returns a np.array of boolean values.

In[1]: arr = np.array([[1,2,3],[4,5,6]])

In[2]: arr != None

Out[2]:
array([[ True,  True,  True],
       [ True,  True,  True]])

What you want to do is

In[3]: arr is not None
Out[3]: True

Generally if you want to check if a values is not None. Use: val is not None.

1 Comment

Thank you. you draw a good example of what != means for for numpy arrays.
0

Thanks to Matthias, I learnt about my problem. That is, I have to compare objects with None using is.

Now that I know about is operator, I found a stackoverflow question\answer which explains why we should choose is over == (or is not over !=).

Note: the good news is that is not also works for my case; that is, replacing it with != returns my expected values (False, True and True respectively).

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.