Evaluate expression using lists maxima - list

I'd like the result of the below maxima input to be [6,12,18] but it results in 2ac. Can anyone help?
a:2;
c:[1,2,3];
b:'(a*c);
''b;
a:3;
''b;
f:'(b*2);
''f;

I think ev(f, infeval) is what you want. See ? ev for info about infeval and other evaluation flags.
(%i1) c : [1, 2, 3];
(%o1) [1, 2, 3]
(%i2) b : '(a*c);
(%o2) a c
(%i3) a : 3;
(%o3) 3
(%i4) f : '(b*2);
(%o4) 2 b
(%i5) f;
(%o5) 2 b
(%i6) ''f;
(%o6) 2 a c
(%i7) ev (f);
(%o7) 2 a c
(%i8) ev (f, infeval);
(%o8) [6, 12, 18]
You can also write ev(f, infeval); as just f, infeval; at the input prompt.
That said, my advice is, don't try too hard to find tricky ways to evaluate stuff. It's easy to write something which has unexpected results and hard to understand. You'll have to find a balance between trying to get Maxima to do what your want, and accommodating Maxima's idiosyncrasies (i.e. changing your ideas to match Maxima's).

You should use f:'(''b*2);. This works as you expect.

Related

How to use grepl with a character vector length greater than one?

Trying to create a conditional dummy variable (c) which converts b >= x to c = 1 and b < x to c = 0.
An example output when x = 3:
a b c
1 1 0
2 3 1
3 4 1
4 2 0
df$c<-ifelse(grepl(b[b <= 3], df$b), as.numeric(1), as.numeric(0))
I've tried using the above ifelse() function, but grepl allows for a character of only length 1:
In grepl(b[b <= 3],df$b) :
(argument 'pattern' has length > 1 and only the first element will be used)
I think your a bit confused with grepl and how (and when) regular expressions are used. Regular expressions are used to find patterns in strings (such as figuring wheter "b", "d", or "g" a part of variable b, one could use grepl("[bdg]", b, ignore.case = TRUE)). If b is numeric, you use conditional statements (as you have).
Basically you could use
df$c <- with(df, ifelse(b <= 3, 1, 0))
or
df$c <- ifelse(df$b <= 3, 1, 0)
or similarly using transform
df <- transform(df, c = ifelse(b<=3, 1, 0))
The confusion is likely that you are trying to figure out which of the ifelse statement is 1 or 0. For this you could use which
df$c <- 0
df$c[which(b <= 3)] <- 1

Reading In Integers in Python

So, my question is simple. I'm simply struggling with syntax here. I need to read in a set of integers, 3, 11, 2, 4, 4, 5, 6, 10, 8, -12. What I want to do with those integers is place them in a list as I'm reading them. n = n x n array in which these will be presented. so if n = 3, then i will be passed something like this 3 \n 11 2 4 \n 4 5 6 \n 10 8 -12 ( \n symbolizing a new line in input file)
n = int(raw_input().strip())
a = []
for a_i in xrange(n):
value = int(raw_input().strip())
a.append(value)
print(a)
I receive this error from the above code code:
value = int(raw_input().strip())
ValueError: invalid literal for int() with base 10: '11 2 4'
The actual challenge can be found here, https://www.hackerrank.com/challenges/diagonal-difference .
I have already completed this in Java and C++, simply trying to do in Python now but I suck at python. If someone wants to, they don't have too, seeing the proper way to read in an entire line, say " 11 2 4 ", creating a new list out that line, and adding it to an already existing list. So then all I have to do is search said index of list[ desiredInternalList[ ] ].
You can split the string at white space and convert the entries into integers.
This gives you one list:
for a_i in xrange(n):
a.extend([int(x) for x in raw_input().split()])
and this a list of lists:
for a_i in xrange(n):
a.append([int(x) for x in raw_input().split()]):
You get this error because you try to give all inputs in one line. To handle this issue you may use this code
n = int(raw_input().strip())
a = []
while len(a)< n*n:
x=raw_input().strip()
x = map(int,x.split())
a.extend(x)
print(a)

ValueError:[number] is not in the list, even though it is and the code i believe is correct

When i execute this testing code below, i get the error below it:
my_numbers = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10]
my_input = input("Pick a number from 1 to 10?")
number_index = my_numbers.index(my_input)
print(number_index)
ERROR-----
number_index = my_numbers.index(my_input) ValueError: '1' is not in
list
is this python? if so, look like is python 3, then the error is simple: input give you a string, and you have a list of integers and no integer is going to be equal to a string, ever, so when you pass my_input, a string, to index it search in the list my_numbers for a match but all the things inside it are integer so it fail and give the error. The solution is simple transform the input to a integer like this:
my_input = int( input("Pick a number from 1 to 10?") )
the same apply to other languages but the fine details may vary...

Pandas Series - print columns and rows

For now I am not so worried about the most performant way to get at my data in a series, lets say that my series is as follows :
A 1
B 2
C 3
D 4
If I am using a for loop to iterate this, for example :
for row in seriesObj:
print row
The code above will print the values down the right hand side, but lets say, I want to get at the left column (indexes) how might I do that?
All help greatly appreciated, I am very new to pandas and am having some teething problems.
Thanks.
Try Series.iteritems.
import pandas as pd
s = pd.Series([1, 2, 3, 4], index=iter('ABCD'))
for ind, val in s.iteritems():
print ind, val
Prints:
A 1
B 2
C 3
D 4

Fast list-product sign for PackedArray?

As a continuation of my previous question, Simon's method to find the list product of a PackedArray is fast, but it does not work with negative values.
This can be "fixed" by Abs with minimal time penalty, but the sign is lost, so I will need to find the product sign separately.
The fastest method that I tried is EvenQ # Total # UnitStep[-lst]
lst = RandomReal[{-2, 2}, 5000000];
Do[
EvenQ#Total#UnitStep[-lst],
{30}
] // Timing
Out[]= {3.062, Null}
Is there a faster way?
This is a little over two times faster than your solution and apart from the nonsense of using Rule### to extract the relevant term, I find it more clear - it simply counts the number elements with each sign.
EvenQ[-1 /. Rule###Tally#Sign[lst]]
To compare timings (and outputs)
In[1]:= lst=RandomReal[{-2,2},5000000];
s=t={};
Do[AppendTo[s,EvenQ#Total#UnitStep[-lst]],{10}];//Timing
Do[AppendTo[t,EvenQ[-1/.Rule###Tally#Sign[lst]]],{10}];//Timing
s==t
Out[3]= {2.11,Null}
Out[4]= {0.96,Null}
Out[5]= True
A bit late-to-the-party post: if you are ultimately interested in speed, Compile with the C compilation target seems to be about twice faster than the fastest solution posted so far (Tally - Sign based):
fn = Compile[{{l, _Real, 1}},
Module[{sumneg = 0},
Do[If[i < 0, sumneg++], {i, l}];
EvenQ[sumneg]], CompilationTarget -> "C",
RuntimeOptions -> "Speed"];
Here are the timings on my machine:
In[85]:= lst = RandomReal[{-2, 2}, 5000000];
s = t = q = {};
Do[AppendTo[s, EvenQ#Total#UnitStep[-lst]], {10}]; // Timing
Do[AppendTo[t, EvenQ[-1 /. Rule ### Tally#Sign[lst]]], {10}]; // Timing
Do[AppendTo[q, fn [lst]], {10}]; // Timing
s == t == q
Out[87]= {0.813, Null}
Out[88]= {0.515, Null}
Out[89]= {0.266, Null}
Out[90]= True